2013-04-25 75 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次迭代,這是顯而易見的。