追查一个项目模块的性能问题(处理时间增加),最终追查到是由于在一个循环中增加了一条读语句。
终于对积少成多对性能的影响有了一次亲身体会。
另一个体会就是追查问题时一定要考虑编译器优化的影响。
对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
计算越复杂的时候,性能优化的效果越明显。
追性能问题,最后不编译优化的情况下追查,因为你可能不清楚编译器为你优化了
后续要补一补基础的编译常识了。