2013-04-25 50 views
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'); 
}} 

为什么二是这么多慢?

+2

什么是您的编译(优化)设置?如果你没有使用Release(-O2或-O3),那么它就没有任何意义。实际上,第二个版本(迭代器)*应该*稍微快一点。 – syam 2013-04-25 13:14:56

+1

您是否正在测试优化版本?另外,尝试预先递增你的字符串迭代器:'++ i'。 – juanchopanza 2013-04-25 13:15:28

+0

第一个变体应该允许更积极的优化,编译器可以很容易地推断出's'在循环内部是有效的,而在第二个习惯用法中它必须确定没有指针混叠发生。 – collapsar 2013-04-25 13:20:40

回答

0

是具有取消引用每次指针你是你的迭代器比较“A”,而不是仅仅比较实际char值。这在大多数情况下是微不足道的,但是通过它进行1,000,000,000次迭代,这是显而易见的。