2
慢迭代我很想知道为什么以下解决方案之一就是要比其他的慢。让concider以下代码:在使用字符串指针
// create a very long string
int x,y;
bool b;
char c[10000];
for (x=0;x<10000;x++)
c[x]='a';
string s(c);
现在我想遍历字符串并将每个字符与其他。第一个解决方案完成了5秒的任务:
for (y=0;y<100000;y++){
for (x=0;x<10000;x++){
b = (s[x]=='a');
}}
和第二在21秒:
string::iterator begin = s.begin();
string::iterator end = s.end();
string::iterator i;
for (y=0;y<100000;y++){
for (i=begin;i<end;i++){
b = (*i=='a');
}}
为什么二是这么多慢?
什么是您的编译(优化)设置?如果你没有使用Release(-O2或-O3),那么它就没有任何意义。实际上,第二个版本(迭代器)*应该*稍微快一点。 – syam 2013-04-25 13:14:56
您是否正在测试优化版本?另外,尝试预先递增你的字符串迭代器:'++ i'。 – juanchopanza 2013-04-25 13:15:28
第一个变体应该允许更积极的优化,编译器可以很容易地推断出's'在循环内部是有效的,而在第二个习惯用法中它必须确定没有指针混叠发生。 – collapsar 2013-04-25 13:20:40