我刚刚开始实现我自己的vector类,我正在使用一个简单的文件来测试它,以检查完成所需的时间。一次测试需要2:30分钟,而其他测试需要90秒和29秒。
某些东西正在影响这门课程的表现。你能帮我跟踪消息来源吗?
测试:
#include "MyVector.h"
const unsigned int SIZE_V= 1000000;
const unsigned int RUNS= 10000;
int main() {
MyVector v(SIZE_V);
for (unsigned int j=0; j<RUNS; ++j) {
for (unsigned int i=0; i<SIZE_V; ++i) {
v[i]= i;
}
}
return 0;
}
班级:
MyVector.h:
#ifndef MY_VECTOR_H
#define MY_VECTOR_H
class MyVector {
public:
MyVector(unsigned int size);
~MyVector();
int& operator[](unsigned int i);
private:
int* _data;
unsigned int _size;
MyVector(const MyVector&);
MyVector& operator=(const MyVector&);
};
#endif
MyVector.cpp:
#include "MyVector.h"
#include <assert.h>
MyVector::MyVector(unsigned int size) : _data(new int[size]) {
}
MyVector::~MyVector() {
delete[] _data;
}
int& MyVector::operator[](unsigned int i) {
assert(i<_size);
return _data[i];
}
修改
这些是测试结果:
granularity: each sample hit covers 4 byte(s) for 0.04% of 27.09 seconds
index % time self children called name
<spontaneous>
[1] 100.0 12.51 14.58 main [1]
11.28 0.00 1410065408/1410065408 MyVector::operator[](unsigned int) [2]
3.31 0.00 1/1 MyVector::~MyVector() [3]
0.00 0.00 1/1 MyVector::MyVector(unsigned int) [7]
-----------------------------------------------
11.28 0.00 1410065408/1410065408 main [1]
[2] 41.6 11.28 0.00 1410065408 MyVector::operator[](unsigned int) [2]
-----------------------------------------------
3.31 0.00 1/1 main [1]
[3] 12.2 3.31 0.00 1 MyVector::~MyVector() [3]
-----------------------------------------------
0.00 0.00 1/1 main [1]
[7] 0.0 0.00 0.00 1 MyVector::MyVector(unsigned int) [7]
-----------------------------------------------
答案 0 :(得分:2)
您可能想要做的一件事是内联operator[]
。当我这样做时,我的盒子上的代码性能从
real 0m18.270s
到
real 0m6.030s
在后一个测试中,测试循环的每次迭代大约需要0.6ns(!)或大约1.5个时钟周期。
这是在使用带有-O3
的g ++ 4.7.2的Sandy Bridge盒子上。
P.S。代码中存在一个错误:构造函数未初始化_size
,因此assert()
具有未定义的行为。
答案 1 :(得分:1)
在没有运行探测器的情况下进行测量。
衡量完全优化的代码:g++ -O3
答案 2 :(得分:0)
您正在写: -
1000000 * 10000 * 4 * 8 = 320000000000
在测试中总共个数据位: -
2.5 mins = 2133333333 bits / sec = ~2,000 MB/s
90 secs = 3555555555 bits / sec = ~3,400 MB/s
30 secs = 10666666666 bits / sec = ~10,000 MB/s
DDR2峰值数据速率介于3,200 MB / s和8,533 MB / s之间,DDR3峰值数据范围介于6,400 MB / s和17,066 MB / s /
之间基于此,我会说你有DDR3-1600 ram芯片。