소스코드리뷰(XXXV) 코드 프로파일러를 만들어 보자

[목차(도우미)]
코드의 실행 속도를 개선하기 위하여 어느 처리가 얼마나 시간이 걸리는지, 또 어디를 개선해야 하는지를 정량적으로 접근하기 위해서는 각 처리문의 실행 시간을 측정하는 것이 필요하다.

이전에는 기존의 코드 프로파일러를 사용하는 방법을 리뷰했는데, 이 방법은 Visual Basic 5, 6의 방법이고 시중에는 비싸고 고기능의 프로파일러가 존재하는 것으로 알고 있다. 값싸고 손 쉽게 실행 시간을 측정하는 방법은 없을까?

째깍수(TickCount)를 세라

윈도 개발 환경이라면 GetTickCount 함수를 사용하면 경과 시간을 밀리초 단위로 계산할 수 있으므로 함수내에서 경과 시간의 차이를 계산해 가면 실행 시간을 추적해낼 수 있다.

리눅스 개발 환경이라면 http://www.devx.com/tips/Tip/30141 등에서와 같이 시간 함수를 사용하면 째깍 수를 동등하게 구할 수 있다.

로그 기록을 이용하라

간단한 로그 기록만으로도 실행 시간을 기록해 두면 편리하다.
  1. long numberOfTick;
  2. void reset_log(){
  3.     numberOfTick = GetTickCount();
  4. }
  5. void write_log(const char *format, ...){
  6.     va_list   arg;
  7.     fp = fopen(filename, "a+");
  8.     long nowTick = GetTickCount();
  9.     fprintf(fp, "n%lf," nowTick - numberOfTick);
  10.     va_start( arg, format);
  11.     vfprintf(fp, format, arg);
  12.     fclose(fp);
  13.     va_end( arg);
  14.     numberOfTick = nowTick;
  15.     // 여기서 다시 GetTickCount();를 실행하는 것이 보다 정확한
  16.     // 경과 시간을 측정하는 것이 된다.
  17. }

로그를 기록하기 위하여 최종 문자열을 넘기는 방식은 많이 보아온 방식이지만 그러기 위하여는 문자열 조작을 많이 필요로 한다. printf의 경우처럼 문자열 출력 형식과 인수를 동시에 넘겨 주는 것이 효율적이다. 그러기 위해는 로그 함수의 원형을 "..."로 정의하여 인수 생략을 받아 주고 사용하는 것이다. 이를 가능하게 해주는 것이 va_list와 v자가 붙는 함수군이다. 물론 printf va_list로 검색해보면 재미난 소스 샘플을 많이 발견할 수 있으므로 응용을 확인해 보는 것도 좋은 일이다.

로그를 기록할 때 CSV형식으로 "시간,함수명,상세기록"의 형식으로 기록해 두면 데이터베이스를 이용하여 실행 시간을 집계하는 것이 간편해 진다. 해보면 금새 알수 있다.
by 금메달.아빠 on 2011. 7. 10. 23:10