我最近注意到,在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。