<分区>
我有一个名为 A
的 int
矩阵,当我按列而不是行迭代它时,它的运行速度慢了大约 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]
有谁知道为什么会这样?我问过几个人,但他们都不知道为什么。我确信这与地址在计算机内存中的表示方式有关,但我仍然想找到更具体的答案。
标签 c++ c arrays performance caching
<分区>
我有一个名为 A
的 int
矩阵,当我按列而不是行迭代它时,它的运行速度慢了大约 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/