在嵌套循环上优化c代码

时间:2013-06-13 11:14:55

标签: c performance optimization for-loop

我有以下代码

for(i=0;i<16;i++)
  for(j=0;j<16;j++)
  {
     in=(i+u*j+rl+rc)&15;
     jn=(v*i+(u*v+1)*j+rc)&15;
     x1[i*16+j]=x2[in*16+jn];
   }

一些注意事项:

  1. rlrcuv的randome值范围为0到15
  2. x1x2是256个值的数组,每个数组值的范围介于0到255之间
  3. 如果我想使用查找表实现此代码需要16MB和这个大内存

2 个答案:

答案 0 :(得分:4)

这是一个想法:

尝试提取至少在内部循环中不会更改为外部的部分计算。例如,i + rl + rc计算中的in不需要在循环内。完成后,您会发现每次迭代in的值增加u,当然模16。因此,您可以进行添加,而不是进行乘法运算。

jn计算也引用了一些可以提取的内容。

当然,这是假设您实际上知道这是一个性能瓶颈(配置它!)并且编译器不够聪明,不能为您做这样的优化。如有疑问,请检查组件。

答案 1 :(得分:2)

你可以尝试一些想法:

您可以为uv的所有组合构建一个查找表,只需要64k的内存。 rlrc水平和垂直地作为常量偏移(它们可以移动到最后一个语句,而不必参与injn的计算。那会减少你必须做的数学量。

与任何其他性能优化一样,您首先需要了解这是否真的是瓶颈。可能是内存要慢很多,引入大型查找表只会减慢速度。