例如,我想使用数组 SQRT[i] 创建一个平方根表来优化游戏,但我不知道在访问 SQRT[i] 的值时,以下初始化之间是否存在性能差异:
硬编码数组
int SQRT[]={0,1,1,1,2,2,2,2,2,3,3,.......255,255,255}
在运行时产生值(value)
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)
...
我不清楚程序是否以不同的方式存储或访问硬编码数组,也不知道编译器是否会优化硬编码数组以加快访问时间,是否有性能它们在访问数组时的区别?
最佳答案
首先,您应该正确处理硬编码数组:
static const int SQRT[]={0,1,1,1,2,2,2,2,2,3,3,.......255,255,255};
(也使用 uint8_t
而不是 int
可能更好,这样可以减少数组的大小并使其对缓存更友好)
与替代方案相比,这样做有一个很大的优势:编译器可以轻松检查数组的内容是否无法更改。
如果没有这个,编译器就必须变得偏执——每个函数调用都可能改变 SQRT
的内容,并且每个指针都可能指向 SQRT
,因此任何通过 int*
或 char*
写入可能会修改数组。如果编译器无法证明这不会发生,那么就会限制它可以进行的优化种类,在某些情况下这可能会影响性能。
另一个潜在的优势是能够在编译时解决涉及常量的问题。
如果需要,您可以巧妙地使用 __restrict__
来帮助编译器解决问题。
在现代 C++ 中,您可以两全其美;应该可以(以合理的方式)编写在编译时运行的代码,将SQRT
初始化为constexpr
。不过,最好问一个新问题。
关于c++ - 访问硬编码数组和运行时初始化数组之间是否存在任何性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31979042/