【发布时间】:2018-04-12 15:17:54
【问题描述】:
我最近注意到,在 C 中访问矩阵的方式看似很小的变化可能会对性能产生很大影响。 例如,假设我们有这两个 C 代码片段。这个:
for(i = 0; i < 2048; i++)
{
for(j = 0; j < 2048; j++) {
Matrix[i][j] = 9999;
}
}
还有这个:
for(j = 0; j < 2048; j++)
{
for(i = 0; i < 2048; i++) {
Matrix[i][j] = 9999;
}
}
第二个版本比第一个版本慢 2 倍。为什么?我认为这与内存管理有关:在每个循环中,第一个版本访问内存中彼此相邻的位置,而第二个版本必须“跳转”到每个循环中的不同区域。 这种直觉对吗? 此外,如果我使矩阵变小(例如 64x64),那么性能没有差异。为什么? 如果有人能提供一个直观而严谨的解释,我将不胜感激。 顺便说一句,我使用的是 Ubuntu 14.04 LTS。
【问题讨论】:
-
你的直觉可能是对的,第一个版本可能对现金更友好。查看生成的汇编代码。
-
@MichaelWalz s/cash/cache
-
@Code-Apprentice s/cash/cache/g