关注性能:循环的耗时及编译优化的影响

追查一个项目模块的性能问题(处理时间增加),最终追查到是由于在一个循环中增加了一条读语句。

终于对积少成多对性能的影响有了一次亲身体会。

另一个体会就是追查问题时一定要考虑编译器优化的影响。

 

对MAX_SIZE= 1000000测试:

 

场景1:

简单的一个语句

 for(size_t i=0; i < MAX_SIZE; ++i){}

需要执行2.768ms, 加上-O3优化后执行0.79ms;

 

场景2:

循环内增加一个操作,(不要是sum+=i; 之类的,因为i已经存到寄存器,所以此部分不会增加多少计算时间)

for(size_t i=0; i < MAX_SIZE; ++i)
{
         sum += intVec[i];
}

需要执行24.971ms, 加上-O3优化后0.825ms;

可以发现比场景1增加了不少时间,但-O3优化后差别不大,这是因为访问一次intVec[i]时,临近的内存值也会放到寄存器,所以访问intVec[i]的时间会减少很多。

 

场景3:

在场景2基础上随机访问intVec

sum += intVec[rand(0, MAX_SIZE)];

for(size_t i=0; i < MAX_SIZE; ++i)
{
          sum += intVec[rand(0, MAX_SIZE)]; //rand(0,n)是取[0,n)之间的随机数
}

需要执行36.010ms(已经去掉了计算rand所用时间),加上-O3优化后,8.85ms

可见:

不经过优化时:2.768ms --》 24.971ms --》36.010ms

经过-O3优化后:0.79ms --》0.825ms  --》8.85ms

计算越复杂的时候,性能优化的效果越明显。

追性能问题,最后不编译优化的情况下追查,因为你可能不清楚编译器为你优化了

 

后续要补一补基础的编译常识了。

posted @ 2012-09-05 09:59  liyuxia713  阅读(210)  评论(0编辑  收藏  举报