多重循环性能优化

简述

循环次数较多,循环层数较多时,程序效率问题非常明显。优化后的多重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]

猜你喜欢

转载自blog.csdn.net/lusanshui/article/details/85088505