c++ - 为什么这个 C++ for 循环的执行时间有显着差异?

标签 c++ performance nested-loops

我正在遍历循环,发现在访问循环方面存在显着差异。 我不明白在这两种情况下导致这种差异的原因是什么?

第一个例子:

执行时间; 8 秒

for (int kk = 0; kk < 1000; kk++)
{
    sum = 0;
    for (int i = 0; i < 1024; i++)
        for (int j = 0; j < 1024; j++)
        {
            sum += matrix[i][j];
        }
}

第二个例子:

执行时间:23秒

for (int kk = 0; kk < 1000; kk++)
{
    sum = 0;
    for (int i = 0; i < 1024; i++)
        for (int j = 0; j < 1024; j++)
        {
            sum += matrix[j][i];
        }
}

是什么导致仅仅交换这么大的执行时间差异

matrix[i][j] 

matrix[j][i]

?

最佳答案

这是内存缓存的问题。

matrix[i][j]matrix[j][i] 有更好的缓存命中率,因为 matrix[i][j] 有更多的连续内存访问机会。

例如,当我们访问matrix[i][0]时,缓存可能会加载一段包含matrix[i][0]的连续内存段,因此, 访问 matrix[i][1], matrix[i][2], ... 将受益于缓存速度,因为 matrix[i] [1], matrix[i][2], ... 靠近 matrix[i][0]

但是,当我们访问matrix[j][0]时,它与matrix[j - 1][0]相距甚远,可能没有被缓存,并且无法从缓存速度中受益。尤其是矩阵通常存储为连续的大段内存,缓存器可以预测内存访问的行为并始终缓存内存。

这就是 matrix[i][j] 更快的原因。这在基于 CPU 缓存的性能优化中很常见。

关于c++ - 为什么这个 C++ for 循环的执行时间有显着差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26583536/

相关文章:

c++ - 查找与 C++ dll 中的方法一起使用的参数

iOS webapp 性能 Safari 与主屏幕启动

python - 如何通过应用 numpy 向量化使用条件检查从 python 列表或 numpy 数组中提取值?

c++ - 无法在阵列添加和性能问题 CPU 与 GPU 中更改超过 10000 的阵列大小

android.os.MessageQueue.next 占用了多个独占时间——这是正常的行为吗?

java - 无法加载二维数组

java - 最大单次卖出利润算法的最优解

c++ - 类型特征 : Check if reference member variable is static or not

c++ - QDialog - 设置背景图片

c++删除两个指针引用的对象