c++ - 将 A[i][j] 更改为 A[j][i] 时,遍历矩阵的速度变慢

标签 c++ c arrays performance caching

<分区>

我有一个名为 Aint 矩阵,当我按列而不是行迭代它时,它的运行速度慢了大约 50 毫秒:

for(int i=0;i<n;i++)  
    for(int j=0;j<n;j++)  
        cout<<A[j][i];    //slower than of A[i][j]

有谁知道为什么会这样?我问过几个人,但他们都不知道为什么。我确信这与地址在计算机内存中的表示方式有关,但我仍然想找到更具体的答案。

最佳答案

由于高速缓存,逐行迭代矩阵更快。

当您访问 A[i][j] 时,加载到缓存中的内存多于一个元素。请注意,矩阵的每一行都存储在连续的内存块中,因此当“周围”的内存 A[i][j] 仍在缓存中时,它更多访问同一行中的下一个元素可能会导致它从缓存而不是主内存中读取(参见 cache miss )。

另见相关问题:
Why does the order of the loops affect performance when iterating over a 2D array?
Which of these two for loops is more efficient in terms of time and cache performance
How cache memory works?
Matrix multiplication: Small difference in matrix size, large difference in timings

关于c++ - 将 A[i][j] 更改为 A[j][i] 时,遍历矩阵的速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15062518/

相关文章:

c++ - 如何提取音频/视频文件的持续时间?

c - 均匀分布 : Bug or Paradox

c - 将 listen() 积压设置为 0

javascript - 对象数组 - 与其他列数据相比增加一列

php - 保存每个 ACF 重复器字段行的值并将所有值放入一个数组 (PHP)

c++ - 如何避免为我的不可变类编写赋值运算符

c++ - MATLAB任意代码执行

c++ - 运算符方法是否占用 C++ 对象中的内存?

c - 为什么 CMake 看不到 FLEX 生成的源文件?

java - 二维 boolean 数组创建和赋值。编译时错误