我对以下与性能相关的代码存有疑问。对我来说两个看起来都一样但有些人说他们是不同的。但我没有得到任何适当的解释。
你对此有所了解吗?
案例1:
for ( int x ; x < LENGTH ; x++ )
for ( int y ; y < LENGTH ; y++ )
arr[x+y*rowLength] = arr[x+y*rowLength]<<2;
案例2:
for ( int y ; y < LENGTH ; y++ )
for ( int x ; x < LENGTH ; x++ )
arr[x+y*rowLength] = arr[x+y*rowLength]<<2;
答案 0 :(得分:3)
关于引用的局部性和高速缓冲存储器。作为一种心理练习,人们可以设想“arr”足够小以适应缓存线并且速度没有差异的情况。然后有些情况下,arr足够大,会有所不同。但没有什么能比实际测试它更好。特别是因为缓存是一个依赖于平台的问题。
如同措辞一样,这个问题留下了一个未定义的重要变量,即LENGTH。对于这个问题,10,000,000的长度可能产生性能差异,其中LENGTH为16可能不会。
注意,我把练习留给你去弄清楚哪个更快。
PS:编译器可以执行称为循环展开的优化。智能编译器可以确定嵌套循环可以展开,但我猜通常只会展开外部循环。无论哪种方式,根据您编写上述代码的方式,您都可以影响编译器优化最终指令的程度。但对于这个问题,这可能是不合时宜的,因为这可能是在计算机体系结构的计算机科学课程中。