웬디의 기묘한 이야기

글 작성자: WENDYS
반응형

 

windows program을 주력으로 개발하다 보니 자연스럽게 사용하던 clock을 이용하여 시간을 측정했습니다. 그런데 linux에서도 똑같이 시간을 측정했는데 system() API를 사용한 부분이 예상 시간이랑 너무나도 차이가 있더라고요... 확인해보니 리눅스에서의 시간 측정 방법이 잘못된 거였습니다.

 

 

 

 

LINUX에서 실행 시간 측정

 

clock()

CPU의 시간을 측정하는 API입니다. 즉, 프로세스가 CPU를 점유하지 않을 때는 시간이 측정되지 않게 되는데요, sleep(), system() API 등 CPU가 점유하지 않는 API를 사용한 시간은 측정이 되지 않습니다.

 

 

gettimeofday()

wall clock time이라고 하여 동작 시간을 측정하는 방식입니다. CPU의 동작 시간만을 확인하는 거와 달리 sleep(), system() 등 모든 동작의 시간을 측정할 수 있습니다.

 

#include<stdio.h>
#include<unistd.h>
#include<sys/time.h>

struct timeval start = {};
gettimeofday(&start, NULL);

...
usleep(1000 * 1000);
...

struct timeval end = {};
gettimeofday(&end, NULL);


//
// 실제 동작시간을 측정하는 공식.
//

double time = end.tv_sec + end.tv_usec / 1000000.0 - start.tv_sec - start.tv_usec / 1000000.0;

printf("%lf sec", time);

 

결과는 아래와 같이 표현됩니다.
> 0.3 sec
> 1.0 sec

 

 

WINDOWS에서 실행 시간 측정

 

GetProcessTimes

Linux에서처럼 CPU시간을 측정하기위한 API입니다. MSDN을 참조하세요.

https://docs.microsoft.com/ko-kr/windows/win32/api/processthreadsapi/nf-processthreadsapi-getprocesstimes

 

GetProcessTimes function (processthreadsapi.h) - Win32 apps

Retrieves timing information for the specified process.

docs.microsoft.com

 

 

clock()

windows는 기본적으로 wall clock time을 측정하기 때문에 visual studio를 이용한 빌드시 clock() API만을 사용하면 전체적인 동작 시간을 측정할 수 있습니다.

 

#include<iostream>
#include<ctime>

clock_t start = clock();

...
Sleep(1000);
...

clock_t end = clock();

//
// 실제 동작시간을 측정하는 공식.
//

double time = (double)(end - start) / CLOCKS_PER_SEC;

printf("%lf sec", time);

 

결과는 아래와 같이 표현됩니다.
> 0.3 sec
> 1.0 sec

 

 

반응형