关于交换循环的性能问题

时间:2017-05-29 19:20:31

标签: c performance

我从c测试中得到了这个问题。我对这个问题的表现肯定非常好奇。我不知道该回应什么。我的问题完全一样。为什么性能有所改善?

  

假设你有以下代码迭代一个大的(2000   通过2000)正方形2D数组并计算非零元素的数量   数组。你交换了两个内部循环的顺序,以便x循环   现在是y循环。这大大提高了你的表现   码。为什么呢?

int total = 0;
for (int x = 0; x < side_length; x++) {
   for (int y = 0; y < side_length; y++) {
      if(array[y][x] != 0) {
         total += 1;
      }
   }
}

2 个答案:

答案 0 :(得分:1)

如果你有一个2000到2000的矩阵,你将拥有2000个2000个元素的数组。逐个元素访问数组将按顺序访问内存,因为一个数组的内存是连续的。这是最好的情况,因为cpu可以优化你的内存访问。

迭代2d数组有两种方法:第一行和第一列。在第一行迭代中,在迭代下一个数组之前完全遍历所有数组时,可以按顺序访问内存。在第一列中,您可以访问所有数组的所有第一个索引,然后访问第二个索引,依此类推。那些是随机内存访问,它们无法通过cpu进行优化。

您可以在维基百科上阅读此article以获取更多信息。

答案 1 :(得分:1)

原因在于cpu HW。

C中的数组是其元素的连续列表(二维数组是内部数组的连续列表)。

cpu花费同样的时间加载小数据以及数据范围作为其数据总线宽度(对于许多现代cpu来说是64位)。 如此多的cpus加载数据与数据总线的宽度一样宽;一些cpu甚至执行顺序“宽”传输的短暂,快速突发传输。数据被加载到缓存中(一种非常大的寄存器)。 请求的数据部分直接加载到cpu寄存器中。

如果发出以下请求,则可以立即从缓存中获取下一个数据,而无需花时间访问内存。

如果cpu访问数据随机扩散,缓存中的数据会因新数据而过载,并且缓存优势会丢失。