我有以下代码
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
的randome值范围为0到15 x1
和x2
是256个值的数组,每个数组值的范围介于0到255之间答案 0 :(得分:4)
这是一个想法:
尝试提取至少在内部循环中不会更改为外部的部分计算。例如,i + rl + rc
计算中的in
不需要在循环内。完成后,您会发现每次迭代in
的值增加u
,当然模16。因此,您可以进行添加,而不是进行乘法运算。
jn
计算也引用了一些可以提取的内容。
当然,这是假设您实际上知道这是一个性能瓶颈(配置它!)并且编译器不够聪明,不能为您做这样的优化。如有疑问,请检查组件。
答案 1 :(得分:2)
你可以尝试一些想法:
您可以为u
和v
的所有组合构建一个查找表,只需要64k的内存。 rl
和rc
水平和垂直地作为常量偏移(它们可以移动到最后一个语句,而不必参与in
和jn
的计算。那会减少你必须做的数学量。
与任何其他性能优化一样,您首先需要了解这是否真的是瓶颈。可能是内存要慢很多,引入大型查找表只会减慢速度。