Develop

lambda 호출시간?

작은이야기 2012. 5. 30. 16:44

코드

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <Windows.h>
class ScopeTime
{
public:
 ScopeTime()
  : start_time(GetTick64())
 { 
 }
 ~ScopeTime()
 {
  end_time = GetTick64(); 
  std::cout << end_time - start_time << std::endl;
 }
 unsigned long long GetTick64()
 {
  FILETIME file_time;
  GetSystemTimeAsFileTime(&file_time);
  return ((unsigned long long)file_time.dwHighDateTime << 32 | (unsigned long long)file_time.dwLowDateTime) /10;
 }
 unsigned long long start_time;
 unsigned long long end_time;
};

static const int INNER_LOOP_COUNT = 10000 ;
static const int OUTTER_LOOP_COUNT = 10000 ;

void func1(int a1, int a2, int a3)
{
 for(int i=0; i<INNER_LOOP_COUNT; ++i);
}

void func2(int &a1, int &a2, int &a3)
{
 for(int i=0; i<INNER_LOOP_COUNT; ++i);
}

inline void func3(int a1, int a2, int a3)
{
 for(int i=0; i<INNER_LOOP_COUNT; ++i);
}

inline void func4(int &a1, int &a2, int &a3)
{
 for(int i=0; i<INNER_LOOP_COUNT; ++i);
}

void func11()
{
 for(int i=0; i<INNER_LOOP_COUNT; ++i);
}

void func12(int a1)
{
 for(int i=0; i<INNER_LOOP_COUNT; ++i);
}

void func13(int a1, int a2)
{
 for(int i=0; i<INNER_LOOP_COUNT; ++i);
}

void func14(int a1, int a2, int a3)
{
 for(int i=0; i<INNER_LOOP_COUNT; ++i);
}

void func15(int a1, int a2, int a3, int a4)
{
 for(int i=0; i<INNER_LOOP_COUNT; ++i);
}

template < typename TYPE >
void TestFunc( TYPE func )
{
 func();
}

int main(int argc, char* argv[])
{
 int a1;
 int a2;
 int a3;
 int a4;
 auto lambda1 = [a1]{ for(int i=0; i<INNER_LOOP_COUNT; ++i); };
 auto lambda1_1 = [&a1]{ for(int i=0; i<INNER_LOOP_COUNT; ++i); };
 auto lambda2 = [a1, a2]{ for(int i=0; i<INNER_LOOP_COUNT; ++i); };
 auto lambda2_1 = [&a1, &a2]{ for(int i=0; i<INNER_LOOP_COUNT; ++i); };
 auto lambda3 = [a1, a2, a3]{ for(int i=0; i<INNER_LOOP_COUNT; ++i); };
 auto lambda3_1 = [&a1, &a2, &a3]{ for(int i=0; i<INNER_LOOP_COUNT; ++i); };
 auto lambda4 = [=]{ for(int i=0; i<INNER_LOOP_COUNT; ++i); };
 auto lambda4_1 = [&]{ for(int i=0; i<INNER_LOOP_COUNT; ++i); };

 TestFunc( lambda3 );

 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) lambda1(); }
 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) lambda1_1(); }
 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) lambda2(); }
 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) lambda2_1(); }
 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) lambda3(); }
 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) lambda3_1(); }
 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) lambda4(); }
 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) lambda4_1(); }
 std::cout << std::endl;

 { ScopeTime st;
    for(int i=0; i<OUTTER_LOOP_COUNT; ++i) [a1]{ for(int i=0; i<INNER_LOOP_COUNT; ++i); }(); }
 { ScopeTime st;
    for(int i=0; i<OUTTER_LOOP_COUNT; ++i) [&a1]{ for(int i=0; i<INNER_LOOP_COUNT; ++i); }(); }
 { ScopeTime st;
    for(int i=0; i<OUTTER_LOOP_COUNT; ++i) [a1, a2]{ for(int i=0; i<INNER_LOOP_COUNT; ++i); }(); }
 { ScopeTime st;
    for(int i=0; i<OUTTER_LOOP_COUNT; ++i) [&a1, &a2]{ for(int i=0; i<INNER_LOOP_COUNT; ++i); }(); }
 { ScopeTime st;
    for(int i=0; i<OUTTER_LOOP_COUNT; ++i) [a1, a2, a3]{ for(int i=0; i<INNER_LOOP_COUNT; ++i); }(); }
 { ScopeTime st;
    for(int i=0; i<OUTTER_LOOP_COUNT; ++i) [&a1, &a2, &a3]{ for(int i=0; i<INNER_LOOP_COUNT; ++i); }(); }
 std::cout << std::endl;

 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) [=]{ for(int i=0; i<INNER_LOOP_COUNT; ++i); }(); }
 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) [&]{ for(int i=0; i<INNER_LOOP_COUNT; ++i); }(); }
 std::cout << std::endl;

 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) func1(a1, a2, a3); }
 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) func2(a1, a2, a3); }
 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) func3(a1, a2, a3); }
 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) func4(a1, a2, a3); }
 std::cout << std::endl;

 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) func11(); }
 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) func12(a1); }
 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) func13(a1, a2); }
 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) func14(a1, a2, a3); }
 { ScopeTime st; for(int i=0; i<OUTTER_LOOP_COUNT; ++i) func15(a1, a2, a3, a4); }
 std::cout << std::endl;

 return 0;
}


실행 결과

233013
238014
235013
233013
224013
232014
231013
232013

228013
232013
234014
233013
233013
222013

226013
227013

230013
231014
231013
216012

210012
234014
232013
230013
233014


시간이 다 비슷하다.
내부 구현이 template로 되어 있을지도 모르겠다는 생각을 하며..
람다는 임시 오브젝트를 생성하며 캡쳐한 변수들을 맴버로 갖는다 라고 생각하면 쉬울듯.


# 릴리즈로 빌드하면서 최적화옵션이 maximize 가 되면서 하는일 없는 루프를 싹다 날려버렸나보다.
  최적화 옵션을 끄니 시간이 제대로 나왔다