요약

 

다수의 스레드를 사용한 C/C++ 프로그램에서 clock() 함수를 이용했을 때 발생하는 문제점과 clock_gettime() 함수를 이용하여 수행 시간을 정확하게 측정할 수 있는 방법을 설명한다.

 

 

  clock() 함수를 이용한 시간 측정 방법과 그 문제점

 

일반적으로 C/C++ 프로그래밍 시, <time.h>에 포함된 clock() 함수를 이용하여 아래와 같은 방식으로 수행 시간을 측정한다.

 

clock_t begin, end;

 

begin = clock(); 

 

/ *

 

수행 시간 측정을 원하는 작업

 

* /

 

end = clock();

 

cout << ((end - begin) / CLOCKS_PER_SEC) << endl;

 

이 방법은 싱글스레드 프로그램에서는 정상적으로 동작하나 멀티스레드 프로그램에서 사용할 경우, 시간 측정이 올바르게 되지 않는 것을 확인할 수 있다. 이는 clock() 함수가 단순히 프로세스에 의해 사용 된 클럭 수를 리턴해주기 때문에 하나의 스레드에서 위의 코드를 이용해 시간을 측정하는 동안 다른 스레드의 동작에 의해 클럭 값이 증가하게 되기 때문이다.


 


 

  clock_gettime() 함수를 이용한 올바른 시간 측정 방법

 

정확한 수행 시간을 측정하기 위해서는 <time.h>에 포함된 clock_gettime() 함수를 이용해야 한다. clock_gettime() 함수는 시간을 측정할 시계의 타입을 정의하는 clockid_ttimespec이라는 구조체를 인자로 갖는다.

  • clockid_t : 시계의 타입을 나타내는 인자로써, POSIX에서는 기본적으로 2가지 타입을 제공한다.

  • CLOCK_REALTIME

    시스템 전역에서 사용되는 실제 시간 (Epoch 기준)

    CLOCK_MONOTONIC

    특정 시점 이후로 흐른 시간 (ex. 부팅 후 시간)

  • timespec : 초와 나노초를 멤버로 갖는 구조체. <time.h>에 정의되어 있음.
struct timespec {
        time_t   tv_sec;        /* seconds */
        long     tv_nsec;       /* nanoseconds */
};

 

clock_gettime() 함수는 clockid_t에 입력한 시계를 이용하여 시간을 측정하므로 프로세스에서 사용한 클럭 수를 세는 clock() 함수보다 정확한 수행 시간 측정이 가능하다. 사용 방법은 다음과 같다. clockid_t의 인자로 CLOCK_MONOTONIC 대신 CLOCK_REALTIME을 사용해도 되지만 CLOCK_REALTIME 사용 시, 시간 측정 중에 시스템 시간이 변경될 경우 측정값이 변한다는 문제점이 있다.

 

struct timespec begin, end ;

 

clock_gettime(CLOCK_MONOTONIC, &begin);

 

/ *

 

수행 시간 측정을 원하는 작업

 

* /

 

clock_gettime(CLOCK_MONOTONIC, &end);

 

cout << (end.tv_sec - begin.tv_sec) + (end.tv_nsec - begin.tv_nsec) / 1000000000.0 << endl;

 

 

+ Recent posts