前言
在实际开发过程中,我们避免不了的会用到双重for循环,在一些对效率要求不高的
代码中,这个双重for循环似乎没有什么影响,但是一旦要优化提升效率,那么这个双重
for循环就是我们首当其冲的优化对象了,下面就如何提高双重for循环的效率进行说明。
背景
在网上我们可以搜索到很多关于如何提高双重for循环效率的办法,比如
1.尽量使用单层循环来代替双重for循环;
2.for循环内的变量不要重复申请;
3.对于for循环内重复的计算提出来,只计算一次;
4.打开编译优化;
5.使用内联函数;
6.绑定CPU核;
7.使用原子操作,尽量避免用锁。
以上操作,我都试了一遍,貌似对于我这个必须用双重for循环而且还有顺序(不能用多线程)
的效率提升不大。
艰难的寻求之路
经过不断的尝试,最终让我在cpu内核编程中受到了启发,于是有了以下的解决
办法,和大家分享下。
我们从cpu的调度上来看,一次调度,cpu只用一个寄存器来处理for循环的一次
动作,那么如果我们一次多调用几个寄存器来处理是不是就可以提高效率了,想到这里
就上代码测试以下。
验证历程
以下验证方案要保证内层for循环的循环数,这里是640,累加的这个值,一定要能被640整除。
方案一:常规的for循环(内层循环一次加1),执行10000次640*512的赋值操作,打印出时间
方案二:内层for循环一次加2,执行10000次640*512的赋值操作,打印出时间,
方案三:内层for循环一次加4,执行10000次640*512的赋值操作,打印出时间,
方案四:内层for循环一次加8,执行10000次640*512的赋值操作,打印出时间,
方案五:内层for循环一次加10,执行10000次640*512的赋值操作,打印出时间,
方案六:内层for循环一次加16,执行10000次640*512的赋值操作,打印出时间。
通过比对以上的验证结果发现,并不是内层一次执行的越多越好,一旦寄存器用完了,效率反而会
降低。
结果分析
对以上六种方案进行结果分析总结,具体见如下图表,方案五对我这台电脑的效率提升最高。
结论
经过验证,对于我这台电脑,12700的cpu,12核20线程来说,内层循环一次加10是效率最高的,比常规的for循环效率提升了4.7倍。大家还有什么好的提升双重for循环的方法吗?欢迎大家一起留言,共同学习共同进步,让C++执行效率飞起来吧!