先看两段代码
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
// 使用矩阵元素 matrix[i][j],然后 i 在循环结束后递增
cout << matrix[i][j] << " ";
}
cout << endl;
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
// 使用矩阵元素 matrix[j][i],然后 i 在循环结束后递增
cout << matrix[j][i] << " ";
}
cout << endl;
}
这两段代码在运行时间上有什么区别?
在这段代码中,将matrix[i][j]换成matrix[j][i]会影响内存访问模式,可能导致缓存友好性的变化,从而影响运行速度。
1.matrix[i][j]的情况:
- 外层循环控制行,内层循环控制列,按行访问矩阵元素。
- 连续访问矩阵的一行,这有助于局部性原理,有可能提高缓存命中率,从而提高访问速度。
2.matrix[j][i]的情况:
- 外层循环控制列,内层循环控制行,按列访问矩阵元素。
- 连续访问矩阵的一列,可能导致不同的内存访问模式,可能对缓存不友好,从而可能降低缓存命中率。
运行速度的影响因多种因素而异,包括硬件架构、缓存大小、矩阵的大小等。在某些情况下,这种变化可能对性能产生明显的影响,而在其他情况下可能影响不大。