简述
循环次数较多,循环层数较多时,程序效率问题非常明显。优化后的多重for循环可以提升大半的效率。
方法
一、实例化变量尽量放在for循环体外,只实例化一次。
二、普通变量改为寄存器变量,如i++改为++i。前置递增运算避免了不必要的工作,它把值加1后直接返回改变了运算对象本身。
三、条件比较使用<要快于<=,同理>要快于<=。
四、把外层可以计算的尽可能放到外层;有判断条件的语句与循环不相关的操作语句尽量放在for外面。
五、应将最长的循环放在最内层,循环次数最少的放在最外层,以减少CPU跨切循环层的次数。
for (row = 0; row < 100; ++row)
{
for (col =0; col < 5; ++col)
{
sum = sum + a[row][col];
}
}
如上述代码,效率低。把row放在内层,可以提高效率。
六、对于一个可结合和可交换的合并操作来说,可以通过将一组合并操作分割成2个或更多的部分,并在最后合并结果来提高性能。
原理是–普通代码只能利用CPU的一个寄存器,分割后可以利用多个寄存器。当分割到达一个数量时,寄存器用完,性能不再提升,甚至会开始下降。代码示例如下:
//一般情况代码
for (int i = 1; i < n+1; ++i)
{
res = res OPER i;
}
//循环分割后代码
for (int i = 1; i < n; i+=2)
{
res1 = res1 OPER i;
res2 = res2 OPER (i+1);
}
测试发现,采用这个方法,浮点数计算性能的提升,明显大于整数;乘法计算性能提升,略大于加法。
写在最后
参照链接:[https://blog.csdn.net/u011236602/article/details/81092504]