Search
Duplicate

clock()과 time()의 차이(c언어에서 시간측정하기 2)

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
Scrap
태그
9 more properties

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초 정도 계산시간이 발생하는 것을 볼 수 있다.