我最近注意到,在C中访问矩阵的方式看似微不足道的变化会对性能产生很大影响.例如,让我们假设我们有两个C代码片段.这个:
for(i = 0; i < 2048; i++)
{
for(j = 0; j < 2048; j++) {
Matrix[i][j] = 9999;
}
}
Run Code Online (Sandbox Code Playgroud)
还有这个:
for(j = 0; j < 2048; j++)
{
for(i = 0; i < 2048; i++) {
Matrix[i][j] = 9999;
}
}
Run Code Online (Sandbox Code Playgroud)
第二个版本比第一个版本慢2倍.为什么?我认为它与内存管理有关:在每个循环中,第一个版本访问内存中彼此相邻的位置,而第二个版本必须"跳转"到每个循环中的不同区域.这种直觉是对的吗?此外,如果我使矩阵变小(例如64x64),那么性能没有差别.为什么?如果有人能提供直观而严谨的解释,我将不胜感激.顺便说一下,我正在使用Ubuntu 14.04 LTS.