프로그램을 작성할 때 항상 생각하는 것 중의 하나가 "어떻게 하면 프로그램 동작 속도를 빠르게 할 것인가?" 이다. 이를 위해서 다양한 형태로 프로그램을 작성하고, 그 시간을 측정해본다. 요즘의 컴퓨팅 환경에서는 왠만한 루틴은 GetTickCount 같은 함수로는 시간을 측정할 수 없을 만큼 빠르게 동작한다. 그래서 멀티미디어 타이머라는 것을 사용하기도 한다. 그러나, Visual C++ 6.0 의 Profile 기능을 사용하면 간단하게 0.001 msec 단위까지 연산 속도를 측정할 수 있다.

프로파일 기능을 사용하기 위해서는 프로젝트 셋팅에서 프로파일 기능을 활성화(Enable) 시켜주어야 한다. VC++ 6.0 메뉴에서 [Project]->[Settings...]을 선택하면 아래와 같은 대화 상자가 나타난다. 여기서 Link 탭을 선택하고, [Enable profiling] 항목이 선택되도록 한다.


그림에서는 릴리즈 모드에 대하여 [Enable profiling]을 체크하였는데, 이는 릴리즈 모드에서 시간을 재는 것이 합리적(?)이기 때문이다. 아무래도 디버그 모드에서는 함수의 수행 시간에 디버그 정보 처리에 걸리는 시간이 포함되기 때문에 정확한 시간 측정이 불가능하다.

이제 프로그램을 빌드(F7)하고, 에러가 없이 exe 파일이 생성되도록 한다. 에러가 있다면 당연히 에러를 잡아라. 그리고, 메뉴에서 [Build]->[Profile...] 을 선택한다.


그림과 같이 첫번째 항목인 [Function Timing]을 선택하면, 바로 프로그램이 실행되면서 프로그램 수행 시간을 측정하게 된다.

실제 테스트를 해보자. 가급적 프로파일 기능을 사용하려면 콘솔형(도스형) 프로젝트를 만드는 것이 좋다.(아무래도 깔끔하니까...) 다음과 같은 간단한 도스형 프로그램을 만들어보았다.

-------------------------------------------------------------------------------
#include <stdio.h>
#include <math.h>

double Power1(double p, int n)
{
register int i;
double s;

s = 1;
for( i = 0 ; i < n ; i++ )
s = s * p;

return s;
}

double Power2(double p, int n)
{
return pow(p, n);
}

int main(void)
{
for( int i = 0 ; i < 10000 ; i++ )
{
Power1(1.2, 10);
Power2(1.2, 10);
}

return 0;
}
-------------------------------------------------------------------------------

대충 보면 알 수 있듯이, 1.2의 10승에 대한 연산을 직접 for 문을 사용하여 계산하는 경우와 math 라이브러리에서 제공하는 pow 함수를 사용하여 계산할 때의 시간을 비교하기 위한 프로그램이다. 이 프로그램에 대하여 프로파일을 해보면 출력창(Output window)에 다음과 같은 메시지가 나타난다.

-------------------------------------------------------------------------------
Profile: Function timing, sorted by time
Date: Wed Apr 06 11:12:23 2005


Program Statistics
------------------
Command line at 2005 Apr 06 11:12: "D:\업로드폴더\SpeedChk\Release\SpeedChk"
Total time: 16.673 millisecond
Time outside of functions: 11.598 millisecond
Call depth: 2
Total functions: 4
Total hits: 20001
Function coverage: 75.0%
Overhead Calculated 6
Overhead Average 6

Module Statistics for speedchk.exe
----------------------------------
Time in module: 5.075 millisecond
Percent of time in module: 100.0%
Functions in module: 4
Hits in module: 20001
Module function coverage: 75.0%

Func Func+Child Hit
Time % Time % Count Function
---------------------------------------------------------
3.203 63.1 3.203 63.1 10000 Power2(double,int) (speedchk.obj)
0.988 19.5 5.075 100.0 1 _main (speedchk.obj)
0.884 17.4 0.884 17.4 10000 Power1(double,int) (speedchk.obj)
-------------------------------------------------------------------------------

위에 내용을 잘 읽어보기 바라고, 맨 아래 부분 Func Time 부분을 보자. Power2 함수가 전체 3.203 msec 걸린 반면에 Power1 함수는 0.884 msec 밖에 걸리지 않았다. 즉, 1.2의 10승을 계산할 때 직접 for 문을 사용하여 계산하는 것이 더 빠르다는 것을 알 수 있다.

이처럼 프로파일 기능은 특정 루틴의 연산 시간을 편하게 측정할 수 있다. 그러나, 아쉽게도 Visual C++ .NET 버전부터는 이런 Profile 기능이 빠져있다. 돈을 주고 따로 구입해야 한다는 소문이 있는데, 잘 모르겠다. ^^; 아는 분은 답글을 남겨주시길...
01
Posted by kkokkal
: