[Linux/리눅스] C/C++ 멀티스레드 환경에서의 수행 시간 측정 방법 (clock_gettime 함수 이용)
요약
다수의 스레드를 사용한 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_t와 timespec이라는 구조체를 인자로 갖는다.
- clockid_t : 시계의 타입을 나타내는 인자로써, POSIX에서는 기본적으로 2가지 타입을 제공한다.
CLOCK_REALTIME |
시스템 전역에서 사용되는 실제 시간 (Epoch 기준) |
CLOCK_MONOTONIC |
특정 시점 이후로 흐른 시간 (ex. 부팅 후 시간) |
- timespec : 초와 나노초를 멤버로 갖는 구조체. <time.h>에 정의되어 있음.
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
clock_gettime() 함수는 clockid_t에 입력한 시계를 이용하여 시간을 측정하므로 프로세스에서 사용한 클럭 수를 세는 clock() 함수보다 정확한 수행 시간 측정이 가능하다. 사용 방법은 다음과 같다. clockid_t의 인자로 CLOCK_MONOTONIC 대신 CLOCK_REALTIME을 사용해도 되지만 CLOCK_REALTIME 사용 시, 시간 측정 중에 시스템 시간이 변경될 경우 측정값이 변한다는 문제점이 있다.
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;
'개발 > Linux' 카테고리의 다른 글
[Linux/리눅스] 우분투 홈 디렉토리의 사용자 폴더 경로 변경하기 (0) | 2017.04.26 |
---|---|
[Linux/리눅스] 문자열 패턴 검색하기 (grep 명령어) (0) | 2017.04.23 |
[Linux/리눅스] 디스크 용량 및 파일 용량 확인하기 (df, du 명령어) (0) | 2017.04.19 |
[Linux/리눅스] gcc, g++ 컴파일 최적화 방법 (0) | 2017.03.24 |