为什么内存访问速度如此之慢?

use*_*720 1 c++ memory arrays performance vector

我有一个非常奇怪的性能问题,与访问内存有关.代码段是:

#include <vector>
using namespace std;

vector<int> arrx(M,-1); 
vector< vector<int> > arr(N,arrx);

...
for(i=0;i<N;i++){
  for(j=0;j<M;j++){
    //>>>>>>>>>>>> Part 1 <<<<<<<<<<<<<<
    // Simple arithmetic operations
    int n1 = 1 + 2;  // does not matter what (actually more complicated)
    // Integer assignment, without access to array
    int n2 = n1;

    //>>>>>>>>>>>> Part 2 <<<<<<<<<<<<<<
    // This turns out to be most expensive part
    arr[i][j] = n1;
  }
}
Run Code Online (Sandbox Code Playgroud)

N和M - 是一些大约1000 - 10000左右的常数.当我编译此代码(发布版本)时,如果第2部分被评论,则需要大约15个时钟才能完成.使用这部分,执行时间可达100多个时钟,因此几乎慢了10倍.我期望赋值操作比简单的算术运算便宜得多.如果我们不使用数组,这实际上是正确的.但是使用该阵列,分配似乎要贵得多.我也尝试过1-D阵列而不是2-D - 相同的结果(对于2D显然更慢).我也使用int**或int*而不是vector <vector <int >>>或vector <int> - 结果再次相同.

为什么我在数组赋值中表现不佳,我可以修复它吗?

编辑:还有一个观察结果:如果我们更改了赋值,则在给定代码的第2部分中

arr[i][j] = n1;  // 172 clocks
Run Code Online (Sandbox Code Playgroud)

n1 = arr[i][j];  // 16 clocks
Run Code Online (Sandbox Code Playgroud)

速度(评论中的数字)上升.更有趣的是,如果我们改变这条线:

arr[i][j] = n1; // 172 clocks
Run Code Online (Sandbox Code Playgroud)

arr[i][j] = arr[i][j] * arr[i][j]; // 110 clocks
Run Code Online (Sandbox Code Playgroud)

速度也高于简单分配在内存中读写是否存在差异?为什么我会得到如此奇怪的表现?

提前致谢!

Joh*_*ski 6

你的假设真的是错的......

  1. 写入主内存比进行简单添加要慢得多.
  2. 如果您不进行写操作,则可能会完全优化循环.


dus*_*uff 5

除非你的实际"第1部分"比你的例子要复杂得多让我们相信,所以这里并不奇怪 - 与基本算术相比,内存访问速度慢.此外,如果您正在使用优化进行编译,那么"部分1"的大部分或全部可能会被优化掉,因为结果从未使用过.