프로그램의 시간(성능)측정
2006/12/29 14:31

C 표준함수 clock() 을 이용

(Language : c)
  1. #include <stdio.h>
  2. #include <time.h>
  3.  
  4. void main()
  5. {
  6.      clock_t t1,t2;
  7.      int count=0;
  8.  
  9.      t1=clock();
  10.      for (;;) {
  11.           printf("기다리십시오. %d\n",count++);
  12.           t2=clock();
  13.           if (t2-t1 > 3*CLOCKS_PER_SEC) {
  14.               break;
  15.           }
  16.      }
  17.      printf("끝났습니다.\n");
  18. }

Windows Mutimedia timer 의 timeGetTime() 함수 이용

(Language : c)
  1. DWORD dwStartTime = timeGetTime();
  2. // 중간코드생략
  3. DWORD dwEndTime = timeGetTime();
  4. printf("%d ms", dwEndTime-dwStartTime);

Windows Management 의
QueryPerformanceFrequency/QueryPerformanceCounter() 함수이용


(Language : c)
  1. #define CHECK_TIME_START  __int64 freq, start, end; if (QueryPerformanceFrequency((_LARGE_INTEGER*)&freq))  {QueryPerformanceCounter((_LARGE_INTEGER*)&start);
  2.  
  3. #define CHECK_TIME_END(a,b) QueryPerformanceCounter((_LARGE_INTEGER*)&end);  a=(float)((double)(end - start)/freq*1000); b=TRUE;                        } else b=FALSE;
  4.  
  5. ...
  6.  
  7. CHECK_TIME_START;
  8. // 중간코드 생략
  9. CHECK_TIME_END(Time, err);
  10.  
  11. printf("printf() 걸린 시간은.. %8.6f미리세컨입니다.",Time);

 

VC++6 의 Profile 사용
Project Setting 에서 Link 의 Enable profiling을 체크

사용자 삽입 이미지

Build의 Profile 선택
사용자 삽입 이미지

Profile 대화상자에서 원하는 Profile Type 선택 - 시간측정은 Function timing
Function converage와 Line Coverage 의 분석을 통해 함수의 점유율을 알수 있다.
점유율에 대한 이해는 아래 링크를...
http://www.debuglab.com/knowledge/coverage.html

사용자 삽입 이미지

그러면 아래와 같은 profile 탭에 결과가 나온다.

사용자 삽입 이미지


VS.NET 의 Profile 사용(PGO)

프로젝트 속성에서 C/C++ 탭에서 프로그램 데이타 베이스를 /Zi 이하로 설정
/ZI 일경우 /GL 옵션과 충돌

사용자 삽입 이미지

최적화 옵션에서 최적화를 /O[x] 중 원하는 것 선택
전체 프로그램 최적화에서 /GL 옵션 선택


사용자 삽입 이미지

코드생성 탭에서 기본 런타임 검사를 기본값으로 설정

사용자 삽입 이미지

링커탭에서 일반에 보면 증분링크 사용 안함(/INCREMENTAL:NO)

사용자 삽입 이미지

그러면 설정은 다 끝났다.
이제 빌드를 해야하는데 PGO를 위한 빌드는 빌드창에 프로필 기반 최적화라는 항목이 보인다.
이 항목중에 계측, 업데이트, 최적화, 계측된/최적화된 응용 프로그램 실행 이 있는데 이중 먼저 계측을 선택하여 PGD 파일을 생성한다.
다음 계측된/최적화된 응용 프로그램 실행을 눌러 실제 프로그램을 테스트/연습을 수행한다.
원하는 만큼 수행하여도 된다 이때 수행한 만큼 PGC 파일이 생성된다.
다음 최적화를 눌러 생성된 PGC 파일을 통해 최종 PGD 파일이 생성된다.


사용자 삽입 이미지

최종적으로 pgomrg.exe test.pgd /summary 를 실행해보면 요약된 정보를 얻을수 있다.
도스커맨드 창은 도구에 VisualStudio 2005 command Prompt를 이용하면 별도로 경로명을 지정하지 않아도 편리하게 이용할수 있다.

사용자 삽입 이미지


@CLK
이 방법은 디버깅시 Watch 창에 @CLK 를 입력하여 측정하는 방법이다.
간단하지만 요긴하게 써먹을수 있다.
아래 그림처럼 측정하고자 하는 구간의 첫번째 브레이크 포인터에
@CLK/1000,d 를 하면 초단위로 값을 볼수 있다.
그리고 마지막 브레이크 포인터에 @CLK=0 을 입력한다.
아래 그림을 보면 for문 수행하는 시간이 대략 548초 걸렸다.
디버깅 모드이므로 참고 정도로만 사용할것.
사용자 삽입 이미지




2006/12/29 14:31 2006/12/29 14:31
Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

  1. Subject: 수행시간 측정

    Tracked from 냇가의 흐르는 물처럼... 2007/02/06 18:07  삭제

    1. clock() 이용 // 시작clock_t beginTime;clock_t endTime;beginTime = clock(); // 수행endTime = clock();수행 시간 = (double)(endTime - beginTime) / CLOCKS_PER_SEC 2. timeGetTime() 또는 GetTickCount()해더 파일 : mmsystem.h라이브러리 :..

  • seyool 2009/07/16 14:06  댓글주소  수정/삭제  댓글쓰기
    좋은 정보 감사합니다..
    pgomrg.exe가 오타인거 같네요..
    이거때문에 왜 2008에는 없는걸까 좌절했는데, pgomgr.exe였군요 ㅎㅎ
  • 비밀방문자 2010/03/27 16:50  댓글주소  수정/삭제  댓글쓰기
    관리자만 볼 수 있는 댓글입니다.