在我的 DirectX 程序中,我编写了一个遍历 std::string 的循环,然后我运行性能分析器并意识到这个循环消耗了大量的 CPU 时间。不仅如此,当我运行我的程序时,我还有大约 1300 FPS。所以我决定用这个做点什么,我将基于范围的循环更改为典型的迭代。我的意思是我改变了:
for( char c : std_string_name )
至
for(size_t i=0; i<std_string_name.size(); ++i )
{ char c = std_string_name[i]; }
现在我有大约 1900 FPS。是不是很奇怪?
接下来我决定测试迭代器本身,没有任何循环体。下面我放了一个链接到我的测试结果的屏幕截图。
str 是一个长字符串,aa, bb, cc 是以时钟为单位的时间。
void main(){
for(int i=0;i<10;++i)
str += str;
clock_t a, b, c;
clock_t aa, bb, cc;
a=clock();
iter1(str);
aa = clock() -a ;
b=clock();
iter2(str);
bb=clock()-b;
c=clock();
iter3(str);
cc=clock()-c;
}
void iter1( std::string str ){
for( char c : str ){
}
}
void iter2( std::string str ){
for( char &c : str ){
}
}
void iter3( std::string str ){
for( size_t i=0;i<str.length();++i){
char c = str[i];
}
}
我得到 7017 aa
, 6739 bb
, 1130 cc
。
为什么 for range 循环很慢,对性能的影响如此之大?你怎么看待这件事?如果有人感兴趣 - 当我通过引用而不是通过值更改传递 str 时,结果几乎相同。
顺便提一句。我使用 MSVS 2012