嵌套for循环在c ++中的性能评估

时间:2014-05-23 02:40:15

标签: c++ for-loop

我对以下与性能相关的代码存有疑问。对我来说两个看起来都一样但有些人说他们是不同的。但我没有得到任何适当的解释。

你对此有所了解吗?

案例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;

1 个答案:

答案 0 :(得分:3)

关于引用的局部性和高速缓冲存储器。作为一种心理练习,人们可以设想“arr”足够小以适应缓存线并且速度没有差异的情况。然后有些情况下,arr足够大,会有所不同。但没有什么能比实际测试它更好。特别是因为缓存是一个依赖于平台的问题。

如同措辞一样,这个问题留下了一个未定义的重要变量,即LENGTH。对于这个问题,10,000,000的长度可能产生性能差异,其中LENGTH为16可能不会。

注意,我把练习留给你去弄清楚哪个更快。

PS:编译器可以执行称为循环展开的优化。智能编译器可以确定嵌套循环可以展开,但我猜通常只会展开外部循环。无论哪种方式,根据您编写上述代码的方式,您都可以影响编译器优化最终指令的程度。但对于这个问题,这可能是不合时宜的,因为这可能是在计算机体系结构的计算机科学课程中。

相关问题