c ++二维数组访问速度基于[a] [b]顺序变化?
可能重复:
为什么我的程序在循环8192个元素时很慢?
我一直在用我用来简单地总结二维数组的元素的程序。 一个错字导致了至少在我看来,一些非常奇怪的结果。
处理数组时,矩阵[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]
正如我在意外事故中没有意识到的那样,我注意到我的运行时间显着增加。 为什么是这样?
这是由于程序的缓存行为。
数组只是连续的内存块,因此当访问[row] [column]时,您正在按顺序访问内存。 这意味着您正在访问的数据页面位于同一页面上,因此访问速度更快。
当你做[column] [row]时,你不再按顺序访问那个内存,所以你最终会得到更多的缓存未命中,所以你的程序运行速度会更慢。
matrix[row][col]
和matrix[row][col + 1]
位置相邻。
matrix[row][col]
和matrix[row + 1][col]
的存储位置由SIZE项目数量分隔。
计算机像连续访问内存一样不随意 ,因此相邻访问速度更快。 对于硬盘性能来说,连续读取/写入总是比随机读取/写入要好。 这与你的CPU如何缓存内存有关,并试图预测下一步你需要什么。
这是因为在更快的情况下,CPU的内存预取实际上是有用的,因为您正在以线性方式迭代。 在缓慢的情况下,你在内存中跳转,所以预取没有什么影响,因为数据不太可能在缓存中。
链接地址: http://www.djcxy.com/p/15073.html上一篇: c++ 2d array access speed changes based on [a][b] order?
下一篇: Why bitoperation and multiplication is prefered here over a condition?