我有以下代码
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];
}
一些注意事项:
rl
、rc
、u
和v
是范围从 0 到 15 的随机值x1
和x2
是 256 个值的数组,每个数组值的范围在 0 到 255 之间- 如果我想使用查找表来实现此代码,则需要 16MB 和这么大的内存
最佳答案
这是一个想法:
尝试提取计算中至少在内部循环之外不会改变的部分。例如,in
计算中的 i + rl + rc
不需要位于循环内部。一旦你明白了这一点,你就会意识到 in
的值每次迭代都会增加 u
,当然是模 16。因此,您可以进行加法,而不是乘法。
jn
计算还引用了一些您可以提取的内容。
当然,这是假设您实际上知道这是一个性能瓶颈(对其进行分析!)并且编译器不够智能,无法为您进行此类优化。如有疑问,请检查组件。
关于c - 优化嵌套循环的 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17085698/