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