Scott Meyers 책에서 함수 실행 시간을 측정하는 데 사용할 수있는 범용 일반 람다 식의 예를 찾았습니다. (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;
};
문제는 하나의 실행 만 측정하므로 결과가 매우 다를 수 있다는 것입니다. 안정적인 결과를 얻으려면 많은 실행을 측정해야합니다. 코드 : : 다이브 2015 컨퍼런스에서 Andrei Alexandrescu 강의에 따르면-빠른 코드 작성 :
측정 시간 : tm = t + tq + tn + to
어디:
tm-측정 된 (관찰 된) 시간
t-실제 관심 시간
tq-양자화 노이즈로 추가 된 시간
tn-다양한 소음원에 의해 추가 된 시간
-오버 헤드 시간 (측정, 루핑, 호출 함수)
그가 강의 후반에 말한 것에 따르면, 당신은 그 결과로이 많은 수의 집행을 최소한으로 취해야합니다. 그 이유를 설명하는 강의를 살펴 보시기 바랍니다.
또한 google- https ://github.com/google/benchmark의 매우 훌륭한 라이브러리가 있습니다 . 이 라이브러리는 사용하기 매우 간단하고 강력합니다. Chandler Carruth의 강의를 YouTube에서 실제로이 라이브러리를 사용하고있는 YouTube에서 확인할 수 있습니다. 예를 들어 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;
합니다QueryPerformanceCounter
. Windows에서는을 사용하십시오 .