在我的DirectX程序中,我编写了一个循环,它遍历std :: string然后我运行了性能分析器,并意识到这个循环消耗了极大的CPU时间.当我运行我的程序时,我有大约1300 FPS.所以我决定用这个做点什么,我把基于范围的循环改为典型的迭代.我的意思是我改变了:
for( char c : std_string_name )
Run Code Online (Sandbox Code Playgroud)
至
for(size_t i=0; i<std_string_name.size(); ++i )
{ char c = std_string_name[i]; }
Run Code Online (Sandbox Code Playgroud)
现在我有大约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];
}
}
Run Code Online (Sandbox Code Playgroud)
我得到了7017 aa,6739对bb,1130对cc.
为什么范围循环缓慢影响性能呢?你怎么看待这件事?如果有人感兴趣 - 当我通过引用而不是通过值更改传递str时,结果几乎相同.
BTW.我使用MSVS 2012
(从评论中移出)
基于范围的循环使用迭代器,并且由于额外的调试检查,VC++迭代器在调试模式下往往很慢; 一旦处于发布模式,它们应归结为指针,因此应该没有性能差异.
此外,您的测试没有意义,因为:
str刚刚被访问构建); 要获得具有统计意义的信息,您必须以随机顺序多次重复测试.| 归档时间: |
|
| 查看次数: |
293 次 |
| 最近记录: |