使用std :: chrono :: high_resolution_clock来测量std :: lower_bound执行时间?

时间:2015-10-06 07:58:36

标签: c++ linux c++11 chrono

我使用std :: chrono :: high_resolution_clock来测量std :: lower_bound执行时间。这是我的测试代码:

#include <iostream>
#include <algorithm>
#include <chrono> 
#include <random> 

const long SIZE = 1000000;

using namespace std::chrono;
using namespace std;

int sum_stl(const std::vector<double>& array, const std::vector<double>& vals) 
{
  long temp;
  auto t0 = high_resolution_clock::now();  
  for(const auto& val : vals) {
    temp += lower_bound(array.begin(),array.end(),val) - array.begin();
  }
  auto t1 = high_resolution_clock::now();
  cout << duration_cast<duration<double>>(t1-t0).count()/vals.size() 
       << endl;
  return temp;
}

int main() {
  const int N = 1000;
  vector<double> array(N);

  auto&& seed = high_resolution_clock::now().time_since_epoch().count();
  mt19937 rng(move(seed));
  uniform_real_distribution<float> r_dist(0.f,1.f);

  generate(array.begin(),array.end(),[&](){return r_dist(rng);});
  sort(array.begin(), array.end());

  vector<double> vals;
  for(int i = 0; i < SIZE; ++i) {
    vals.push_back(r_dist(rng));
  }

  int index = sum_stl(array, vals);

  return 0;
}

array是一个带有1000个均匀随机数的有序向量。 vals的大小为100万。首先,我在循环内设置定时器来测量每个std::lower_bound执行,定时结果大约是1.4e-7秒。然后我测试了其他操作,例如+-sqrtexp,但它们都给出了与std::lower_bound相同的结果。

在之前的主题resolution of std::chrono::high_resolution_clock doesn't correspond to measurements中,它说“计时”&#39;分辨率可能不足以表示小于100纳秒的持续时间。所以我为整个循环设置了一个计时器,并通过除以迭代次数得到一个平均值。这是输出:

  

1.343e-14

一定有什么问题,因为它的持续时间甚至比CPU周期时间短,但我无法弄明白。

为了使问题更加通用,我如何测量短函数的准确执行时间?

0 个答案:

没有答案