C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[48116] Re:++, -- 연산자 처리 속도 질문
[] 1704 읽음    2007-02-17 13:40
허정주 님이 쓰신 글 :
: 연산자가 전치/후치에 따라 빠르기 순서가 다음과 같았습니다.
:
: 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)을 사용하셔야 합니다.

+ -

관련 글 리스트
48108 ++, -- 연산자 처리 속도 질문 아루스 1117 2007/02/16
48116     Re:++, -- 연산자 처리 속도 질문 1704 2007/02/17
48113     Re:++, -- 연산자 처리 속도 질문 zi 1100 2007/02/17
48115         Re:Re:++, -- 연산자 처리 속도 질문 아루스 1154 2007/02/17
48121             Re:Re:Re:++, -- 연산자 처리 속도 질문 라스코니 1704 2007/02/19
48288                 Re:Re:Re:Re:++, -- 연산자 처리 속도 질문 쥐르미온 2715 2007/03/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.