|
허정주 님이 쓰신 글 :
: 연산자가 전치/후치에 따라 빠르기 순서가 다음과 같았습니다.
:
: i-- > i++ > ++i > --i
:
: 전 마지막 것이 빠른줄 알고 썼었는데 ㅡㅜ
: 왜 이런지 아시나요;;
:
:
: 아래는 테스트에 사용 된 코드였습니다.
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: unsigned int Before;
: double t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0;
: double loop = 10;
: for ( int i = 0; i < loop; ++i )
: {
: Before = GetTickCount();
: for ( int i = 0; i < 1000000; ++i )
: {
: AnsiString s = AnsiString( "s" );
: }
: t2 += ( GetTickCount() - Before );
:
: Before = GetTickCount();
: for ( int i = 0; i < 1000000; i++ )
: {
: AnsiString s = AnsiString( "s" );
: }
: t3 += ( GetTickCount() - Before );
:
: Before = GetTickCount();
: for ( int i = 1000000; i > 0; --i )
: {
: AnsiString s = AnsiString( "s" );
: }
: t4 += ( GetTickCount() - Before );
:
: Before = GetTickCount();
: for ( int i = 1000000; i > 0; i-- )
: {
: AnsiString s = AnsiString( "s" );
: }
: t5 += ( GetTickCount() - Before );
: }
: Memo1->Lines->Add( FloatToStr( t1 / loop ) );
: Memo1->Lines->Add( FloatToStr( t2 / loop ) );
: Memo1->Lines->Add( FloatToStr( t3 / loop ) );
: Memo1->Lines->Add( FloatToStr( t4 / loop ) );
: Memo1->Lines->Add( FloatToStr( t5 / loop ) );
: }
컴파일러에 따라 처리방식이 다를 수 있을지 모르지만,
++i;와 i++;는 기본적으로는 같은 기계어로 컴파일됩니다.
j=++i;와 j=i++;는 기계어 코드 순서만 다르므로 동일한 속도라고 보아야 합니다.
무엇보다도, 테스트하실 때 제시하신 코드와 같이 하면 안 됩니다.
++i; i++; --i; i--; 각 코드를 for 루프를 돌리면 안 되고 for 루프 돌리는 횟수만큼 증감연산자로 직접 코딩을 해야 하며 빌드 시 "Code Optimization"을 하면 안 됩니다.
제시하신 코드에서 증감연산자를 처리하는데 걸리는 시간비율은 모르긴 해도 천분의 일도 안 될 것으로 보입니다.
AnsiString s = AnsiString( "s" );에서 상대적으로 많은 시간이 걸리고 항상 같은 시간 동안에 처리된다는 보장이 없습니다.
또한, 윈도우즈는 멀티테스킹 운영체제로서 코드실행 도중에 컨텍스트 스위칭이 발생할 수 있으므로 이 부분에서도 오차가 발생하게 됩니다.
또한, GetTickCount 보다 더욱 정밀한 시간간격을 구하는 함수 등(QueryPerformanceCounter,rdtsc)을 사용하셔야 합니다.
|