【发布时间】:2015-11-05 21:05:22
【问题描述】:
比如我想用数组SQRT[i]创建一个平方根表来优化一个游戏,但是不知道下面的初始化访问SQRT[i]的值有没有性能差异:
-
硬编码数组
int SQRT[]={0,1,1,1,2,2,2,2,2,3,3,.......255,255,255} -
在运行时生成值
int SQRT[65536]; int main(){ for(int i=0;i<65536;i++){ SQRT[i]=sqrt(i); } //other code return 0; }
访问它们的一些示例:
if(SQRT[a*a+b*b]>something)
...
我不清楚程序是否以不同的方式存储或访问硬代码数组,也不知道编译器是否会优化硬代码数组以加快访问时间,是否有性能访问数组时的区别?
【问题讨论】:
-
访问时间相同,但数组的初始化/填充将大不相同。
-
这真的会非常依赖编译器和实现。如果您对特定架构编译器执行的优化感兴趣,请添加此
-
旁白:考虑将其改为
uint8_t的数组,以使数组的总大小更小。还要考虑避免平方根;通常a*a + b*b > something*something更好(尽管在这种情况下,这与您编写的测试不同)。 -
是的,我完全同意@Nawaz。访问时间将相同,但由于第二个代码使用了 sqrt(),它将运行 65536 次,可能会比第一个代码花费更多时间。
-
您只能靠自己,但如果没有代码生成器,65536 值出现一位数错误的风险是高 - 恕我直言,这是不允许的。如果您以后需要更改舍入算法,请仅考虑维护问题...可以考虑 256 或更少的值,但我无法想象输入 65536 值!
标签: c++ c arrays optimization hardcode