clock() 함수를 활용한 시간측정
대부분 함수의 시간을 측정하고 싶을 때 아래와 같이 코드를 작성하곤 한다.
#include <time.h>
#include <stdio.h>
int main()
{
clock_t start, end;
start = clock();
// 시간 측정을 실행할 함수..
end = clock();
printf("[time : %f]\n", (float)(end - start)/CLOCKS_PER_SEC);
}
C
복사
하지만 이때 사용되는 clock()은 cpu의 클럭수로 시간을 측정하기 때문에 정확한 시간이라고 하긴 어렵다.
예를들어 함수 중간에 sleep()을 사용한다면, 그동안 프로그램은 전혀 동작하지 않기 때문에 정확한 시간측정이 어려울 수 있다.
그렇다면 sleep()중인 시간까지 포함한 프로그램은 어떻게 측정할 수 있을까?
이제 time() 함수에 대해 알아보자
time() 함수를 활용한 시간 측정
time() 함수는 현재 캘린더 시간(초)을 판별한다.
#include <time.h>
time_t time(time_t *timeptr);
C
복사
time() 함수는 현재 캘린더 시간을 리턴한다. 또한 리턴값도 timeptr에서 지정한 위치에 저장된다. (timeptr이 NULL인 경우 리턴값은 저장되지 않는다)
캘린더 시간을 사용할 수 없으면 값 (time_t)(-1)이 리턴된다.
#include <time.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
time_t start, end;
time(&start);
sleep(2);
time(&end);
printf("time = %f\n", (float)(end - start)); // 출력
return (0);
}
C
복사
하지만 위의 코드는 초단위 측정밖에 되지 않는다.
usleep()으로 ms단위까지 조절하면서 섬세한 측정을 하고싶다면 일반적인 time()함수로는 어려움이 있다. 이러한 문제는 gettimeofday()함수를 활용하면 해결할 수 있다.
gettimeofday() 함수 활용하기
gettimeofday()은 time(2)와 매우 비슷하지만 마이크로초 단위의 시간 까지 되돌려준다. 현재는 time(2)를 대신해서 쓰이고 있으며, 가능한 time(2)대신 이 함수를 사용하는 걸 권장한다.
#include <sys/time.h>
#include <unistd.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
C
복사
첫번째 인자인 tv는 현재 시스템 시간을 저장하기 위한 구조체로 다음과 같이 정의되어 있다.
struct timeval
{
long tv_sec; // 초
long tv_usec; // 마이크로초
}
C
복사
두번째 인자인 tz은 타임존을 설정하기 위해서 사용된다.
하지만 현재는 사용되지 않으며 해당 인자는 항상 NULL로 두면 된다.
struct timezone
{
int tz_minuteswest: // 그리니치 서측분차
int tz_dsttime // DST 보정타입(일광 절약시간)
}
C
복사
이제 아래 예제를 통해 연습해보자!
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
int main() {
struct timeval tv;
double begin, end;
// 시작하는 시간 받아오기
gettimeofday(&tv, NULL);
begin = (tv.tv_sec) * 1000 + (tv.tv_usec) / 1000 ;
// 시간 측정을 진행할 부분
usleep(1500000);
// 끝나는 시간 받아오기
gettimeofday(&tv, NULL);
end = (tv.tv_sec) * 1000 + (tv.tv_usec) / 1000 ;
// 출력
printf("Execution time %f\n", (end - begin) / 1000);
return (0);
}
C
복사
위 코드를 실행해보면 usleep(1500000)은 1.5초 정도의 sleep을 하지만
추가로 0.002초 정도 계산시간이 발생하는 것을 볼 수 있다.