在Scott Meyers的书中,我找到了一个通用通用lambda表达式的示例,该表达式可用于衡量函数执行时间。(C ++ 14)
auto timeFuncInvocation =
[](auto&& func, auto&&... params) {
// get time before function invocation
const auto& start = std::chrono::high_resolution_clock::now();
// function invocation using perfect forwarding
std::forward<decltype(func)>(func)(std::forward<decltype(params)>(params)...);
// get time after function invocation
const auto& stop = std::chrono::high_resolution_clock::now();
return stop - start;
};
问题是您仅衡量一次执行,因此结果可能会大不相同。为了获得可靠的结果,您应该评估大量的执行。根据Andrei Alexandrescu在code :: dive 2015大会上的演讲-编写快速代码I:
测量时间:tm = t + tq + tn +至
哪里:
tm-测量(观察)的时间
t-实际的实际时间
tq-量化噪声增加的时间
tn-各种噪声源相加的时间
至-开销时间(测量,循环,调用函数)
根据他在演讲的稍后部分所说的,您应该从大量的执行中获取最少的结果。我鼓励您看一下他解释其原因的演讲。
谷歌还有一个很好的库-https: //github.com/google/benchmark。该库非常简单易用,功能强大。您可以在YouTube上查看钱德勒·卡鲁斯(Chandler Carruth)在实践中使用此库的一些讲座。例如CppCon 2017:钱德勒·卡鲁斯(Chandler Carruth)“走得更快”;
用法示例:
#include <iostream>
#include <chrono>
#include <vector>
auto timeFuncInvocation =
[](auto&& func, auto&&... params) {
// get time before function invocation
const auto& start = high_resolution_clock::now();
// function invocation using perfect forwarding
for(auto i = 0; i < 100000/*largeNumber*/; ++i) {
std::forward<decltype(func)>(func)(std::forward<decltype(params)>(params)...);
}
// get time after function invocation
const auto& stop = high_resolution_clock::now();
return (stop - start)/100000/*largeNumber*/;
};
void f(std::vector<int>& vec) {
vec.push_back(1);
}
void f2(std::vector<int>& vec) {
vec.emplace_back(1);
}
int main()
{
std::vector<int> vec;
std::vector<int> vec2;
std::cout << timeFuncInvocation(f, vec).count() << std::endl;
std::cout << timeFuncInvocation(f2, vec2).count() << std::endl;
std::vector<int> vec3;
vec3.reserve(100000);
std::vector<int> vec4;
vec4.reserve(100000);
std::cout << timeFuncInvocation(f, vec3).count() << std::endl;
std::cout << timeFuncInvocation(f2, vec4).count() << std::endl;
return 0;
}
编辑:当然,您始终需要记住,您的编译器可以优化某些内容或没有进行优化。在这种情况下,像perf这样的工具可能会很有用。
clock_gettime
.. gcc将其他时钟定义为:typedef system_clock steady_clock; typedef system_clock high_resolution_clock;
在Windows上,使用QueryPerformanceCounter
。