C 交换循环的性能问题

C 交换循环的性能问题,c,performance,C,Performance,我是通过c测试得到这个问题的。我对这个问题的表现肯定很好奇。我不知道该怎么回答。我的问题完全一样。为什么性能有所提高 假设您有下面的代码,它在一个大的(2000 到2000年)对二维阵列进行平方运算,并计算阵列中非零元素的数量 阵列。交换两个内部循环的顺序,以使x循环 现在是y循环。这大大提高了您的应用程序的性能 代码。为什么? int-total=0; 对于(int x=0;x

我是通过c测试得到这个问题的。我对这个问题的表现肯定很好奇。我不知道该怎么回答。我的问题完全一样。为什么性能有所提高

假设您有下面的代码,它在一个大的(2000 到2000年)对二维阵列进行平方运算,并计算阵列中非零元素的数量 阵列。交换两个内部循环的顺序,以使x循环 现在是y循环。这大大提高了您的应用程序的性能 代码。为什么?

int-total=0;
对于(int x=0;x
如果你有一个2000到2000的矩阵,你将有2000个元素的2000个数组。逐个元素访问数组元素将按顺序访问内存,因为一个数组的内存是连续的。这是最好的情况,因为cpu可以优化内存访问

迭代二维数组有两种方法:行优先和列优先。在第一行迭代中,当您在迭代下一个数组之前完全迭代所有数组时,您将按顺序访问内存。在第一列中,访问所有数组的第一个索引,然后访问第二个索引,依此类推。这些是随机内存访问,cpu无法对其进行优化


你可以在维基百科上阅读这篇文章以了解更多信息。

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

迭代二维数组有两种方法:行优先和列优先。在第一行迭代中,当您在迭代下一个数组之前完全迭代所有数组时,您将按顺序访问内存。在第一列中,访问所有数组的第一个索引,然后访问第二个索引,依此类推。这些是随机内存访问,cpu无法对其进行优化


你可以在维基百科上阅读这篇文章以了解更多信息。

原因在于cpu硬件

C中的数组是其元素的邻接列表(二维数组是内部数组的邻接列表)

cpu在加载小数据和数据总线宽度(许多现代cpu为64位)的同时,也在加载数据总线宽度。 如此多的CPU加载数据的宽度与其数据总线的宽度相同;一些cpu甚至对连续的“宽”传输执行短而快速的突发传输。数据加载到缓存(一种非常大的寄存器)中。 请求的数据部分直接加载到cpu寄存器中

在以下请求的情况下,下一个数据将立即从缓存中可用,而无需花费时间访问内存


如果cpu访问数据随机分布,则缓存中的数据会因新数据而过载,并且缓存好处会丢失。

原因在于cpu硬件

C中的数组是其元素的邻接列表(二维数组是内部数组的邻接列表)

cpu在加载小数据和数据总线宽度(许多现代cpu为64位)的同时,也在加载数据总线宽度。 如此多的CPU加载数据的宽度与其数据总线的宽度相同;一些cpu甚至对连续的“宽”传输执行短而快速的突发传输。数据加载到缓存(一种非常大的寄存器)中。 请求的数据部分直接加载到cpu寄存器中

在以下请求的情况下,下一个数据将立即从缓存中可用,而无需花费时间访问内存


如果cpu访问数据随机分布,缓存中的数据会因新数据而过载,并且缓存的好处会丢失。

我看不到任何数组!仅仅因为某些东西被称为“数组”,并不意味着它就是一个数组。提供一个。因为您按顺序访问内存,这对cpu来说更有效,因为他可以优化内存访问。如果你反转循环,内存访问将被节省,从而降低效率。它被称为“局部性”属性。缓存效率更高。可能与@EugeneSh重复。我不知道这个概念。有用。我没有看到任何数组!仅仅因为某些东西被称为“数组”,并不意味着它就是一个数组。提供一个。因为您按顺序访问内存,这对cpu来说更有效,因为他可以优化内存访问。如果你反转循环,内存访问将被节省,从而降低效率。它被称为“局部性”属性。缓存效率更高。可能与@EugeneSh重复。我不知道这个概念。有用。
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;
      }
   }
}