当前位置: 首页 > 知识库问答 >
问题:

C++二维数组访问速度的变化基于[a][b]顺序?[副本]

董哲
2023-03-14

可能重复:
为什么我的程序在循环8192个元素时速度很慢?

我一直在修补一个程序,我正在使用它来简单地求和一个2D数组的元素。一个错字导致了至少在我看来,一些非常奇怪的结果。

处理数组时,矩阵[SIZE][SIZE]:

for(int row = 0; row < SIZE; ++row)
    for(int col = 0; col < SIZE; ++col)
        sum1 += matrix[row][col];

运行非常快,然而是上面的行SUM1...已修改

sum2 += matrix[col][row]

就像我在一次意外中没有意识到的那样,我注意到我的运行时间显著增加了。这是为什么?

共有1个答案

钱哲茂
2023-03-14

这是由于程序的缓存行为造成的。

数组只是连续的内存块,所以当您访问[行][列]时,您是在顺序地访问内存。这意味着您正在访问的数据页面位于同一页面上,因此访问速度要快得多。

当您执行[列][行]时,您不再按顺序访问内存,因此您最终会丢失更多的缓存,因此您的程序运行得更慢。

 类似资料:
  • 问题内容: 数据库中列类型的顺序是否对查询时间有影响? 例如,具有混合顺序(INT,TEXT,VARCHAR,INT,TEXT)的表的查询是否比具有连续类型(INT,INT,VARCHAR,TEXT,TEXT)的表的查询慢? 问题答案: 答案是肯定的,这确实很重要,并且可能很重要,但 通常 并不重要。 所有I / O都在页面级别完成(根据您的操作系统,通常为2K或4K)。行的列数据彼此相邻存储,除

  • 问题内容: Core Audio具有C API,可将一些数据复制到您提供的内存中。在一种情况下,我需要传递一个指向AudioBufferList的指针,该指针定义为: UInt32标识缓冲区的数量,并且实际缓冲区紧随其后。 我可以成功获得此: 我无法识别(AudioBuffer)语法,但我认为它并不重要- 我认为括号会被忽略,mBuffers只是一个AudioBuffer,由我自己完成指针数学运算

  • 我到处寻找解决方案,但似乎这项技术不再那么流行了,所以似乎也没有任何答案。

  • 因为在这个例子中,由于指针运算,我能够读取的值: 输出: 我想知道为什么在这个例子中: 然后我无法读取试图指向下一个整数的变量的值,但这就是我得到的: 我试着打印 变量的地址不仅小于数组中第一个元素的地址,甚至也不是前一个。 为什么在第一个例子中变量的地址是连续的,而在第二个例子中不是? 关于变量和缓冲区在堆栈中是如何分配的,我可能有些不明白。 编辑:我知道不应该这样做,但我试图理解缓冲区溢出(更

  • 问题内容: 这个问题是关于 访问 数组和切片 元素 的速度,而不是关于将它们作为参数传递给函数的效率。 我希望在大多数情况下, 数组 比 切片 更快,因为切片是描述数组连续部分的数据结构,因此访问切片的元素(间接访问其基础数组的元素)时可能涉及额外的步骤。 因此,我编写了一个小测试来对一批简单操作进行基准测试。有4个基准测试功能,前两个测试一个 全局 切片和一个全局数组,其他两个测试一个 本地 切

  • 问题内容: 我有一个像这样的数组: 我想基于第二元素按降序对其进行排序。理想的输出为: 问题答案: ,接受可选参数。函数用于生成比较密钥。