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)
速度也高于简单分配在内存中读写是否存在差异?为什么我会得到如此奇怪的表现?
提前致谢!
除非你的实际"第1部分"比你的例子要复杂得多让我们相信,所以这里并不奇怪 - 与基本算术相比,内存访问速度很慢.此外,如果您正在使用优化进行编译,那么"部分1"的大部分或全部可能会被优化掉,因为结果从未使用过.
| 归档时间: |
|
| 查看次数: |
1510 次 |
| 最近记录: |