在简单的矢量实现中优化运行时

时间:2013-01-24 09:18:28

标签: c++ optimization vector

我刚刚开始实现我自己的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]
-----------------------------------------------

3 个答案:

答案 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)

  1. 在没有运行探测器的情况下进行测量。

  2. 衡量完全优化的代码: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芯片。