我使用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秒。然后我测试了其他操作,例如+
,-
,sqrt
,exp
,但它们都给出了与std::lower_bound
相同的结果。
在之前的主题resolution of std::chrono::high_resolution_clock doesn't correspond to measurements中,它说“计时”&#39;分辨率可能不足以表示小于100纳秒的持续时间。所以我为整个循环设置了一个计时器,并通过除以迭代次数得到一个平均值。这是输出:
1.343e-14
一定有什么问题,因为它的持续时间甚至比CPU周期时间短,但我无法弄明白。
为了使问题更加通用,我如何测量短函数的准确执行时间?