[C++] 람다 오버헤드 측정

일반 함수와 펑터, 람다의 호출, 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 은 겁나게 느리다는 걸 알 수 있다.