일반 함수와 펑터, 람다의 호출, std::function을 썼을 때의 오버헤드를 측정해보았다.
자꾸 컴파일러가 최적화를 때려서 최적화는 꺼버렸다.
| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 | #include "stdafx.h"#include "Timer.h"#include #include volatile void func() {} struct Functor{ volatile void operator()() {}}; constexpr auto N = 1LL; //루프 수 using func_t = std::function<volatile void(void)>; int main(){ auto lambda = [\]()->volatile void {}; //람다 volatile void(*lambda_ptr)(void)= [\]()->volatile void {}; func_t lambda_f = [\]()->volatile void {}; auto func_ptr = func; //그냥 함수를 함수포인터로 func_t func_ptr_f = func; //그냥 함수를 function에 auto functor = Functor(); //펑터 Timer timer; timer.start(); for (long long i = 0; i < N; i++) lambda();timer.stop();auto lambda_time = timer.get_nano(); timer.start(); for (long long i = 0; i < N; i++) lambda_f();timer.stop();auto lambda_time_f = timer.get_nano(); timer.start();for (long long i = 0; i < N; i++) lambda_ptr();timer.stop();auto lambda_ptr_time = timer.get_nano(); timer.start();for (long long i = 0; i < N; i++) func_ptr();timer.stop();auto ptr_time = timer.get_nano(); timer.start();for (long long i = 0; i < N; i++) func_ptr_f();timer.stop();auto ptr_time_f = timer.get_nano(); timer.start();for (long long i = 0; i < N; i++) functor();timer.stop();auto functor_time = timer.get_nano(); std::cout << "반복횟수 : " << N << "\n\n"; std::cout << "auto 람다 수행시간\n" << lambda_time << "\n\n"; std::cout << "function 람다 수행시간\n" << lambda_time_f << "\n\n"; std::cout << "람다 포인터 수행시간\n" << lambda_ptr_time << "\n\n"; std::cout << "함수 포인터 수행시간\n" << ptr_time << "\n\n"; std::cout << "function 함수 수행시간\n" << ptr_time_f << "\n\n"; std::cout << "펑터 수행시간\n" << functor_time << "\n\n"; return 0;} Colored by Color Scripter | cs |
코드는 이렇다.
컴파일 환경은 릴리즈모드에 x86이다. 단위는 나노초다.
보통 람다가 느리고 펑터가 빠르다고들 하는데, 의외로 비등비등한 편이다.
그리고 std::functio 은 겁나게 느리다는 걸 알 수 있다.