【发布时间】:2017-08-23 22:32:38
【问题描述】:
让我们考虑一个矩阵
std::vector<std::vector<int>> matrix;
每一行的长度相同。我将每个std::vector<int> 称为一个列。
为什么使用外循环比使用内循环更快地遍历外部维度?
第一个程序:首先遍历列
int sum = 0;
for (int col = 0 ; col < matrix.size() ; col++)
{
for (int row = 0 ; row < matrix[0].size() ; row++)
{
sum += matrix[col][row];
}
}
第二个程序:首先遍历行
int sum = 0;
for (int row = 0 ; row < matrix[0].size() ; row++) // Assuming there is at least one element in matrix
{
for (int col = 0 ; col < matrix.size() ; col++)
{
sum += matrix[col][row];
}
}
这是我的猜测
在记忆中跳跃
我可能有一种模糊的直觉,即在内存中跳转会比读取连续的内存花费更多的时间,但我认为 RAM 的内存访问需要恒定的时间。另外,DRAM 中没有移动部件,我不明白为什么读取两个连续的ints 会更快?
巴士宽度
int 占用 2 个字节(尽管可能因数据模型而异)。在具有 8 字节宽总线的机器中,我可以想象最终如果 ints 在内存中是连续的,那么每个时钟周期可以将 4 个 ints(取决于数据模型)发送到处理器,如果int 不连续,则每个时钟周期只能发送一个。
如果是这种情况,那么如果 matrix 将包含 8 字节长的 long long int,我们将不会再看到这两个程序之间有任何区别(我还没有测试过)。
缓存
我不知道为什么,但我觉得缓存可能是第二个程序变慢的原因。缓存的影响可能与我刚才谈到的总线大小参数有关。有可能只有 DRAM 中连续的内存才能加载到缓存中,但我不知道为什么会这样。
【问题讨论】:
标签: performance caching memory ram