C에서 고해상도(High Resolution) 타이머 사용 방법

1. 윈도우즈

QueryPerformanceCounter와 QueryPerformanceFrequency를 이용하면 된다.
#include <windows.h>

int main(void)
{
    LARGE_INTEGER start, end, frequency;
    double runTime;

    QueryPerformanceFrequency(&frequency); // 초당 틱 수

    QueryPerformanceCounter(&start); // 시작 틱의 개수
    ... // 수행할 내용
    QueryPerformanceCounter(&end); // 종료 틱의 개수

    runTime = ((double)(end.QuadPart - start.QuadPart) / freq.QuadPart) * 1000; // 단위는 ms
}

2. 리눅스

1) gettimeofday 이용 방법 - Wall-clock Time 방식
Reference 2번과 man page의 "conforming to"에 따르면 이 함수는 폐기예정(obsolete)로 지정 되었다. 대신 clock_gettime을 사용을 권장하고 이는 nano seconds 까지 측정 할 수 있다. clock_gettime의 사용법은 3번 항목에 적어두었다.
#include <sys/time.h>

int main(void)
{
    struct timeval start, end;
    double runTime;

    gettimeofday(&start, NULL); // 시작 시간
    ... // 수행할 내용
    gettimeofday(&end, NULL); // 종료 시간

    runTime = (end.tv_sec - start.tv_sec) * 1000.0 + (end.tv_usec - start.tv_usec) / 1000.0; // 단위는 ms
}
2) getrusage 이용 방법 - Process Time 방식
#include <sys/time.h>
#include <sys/resource.h>

int main(void)
{
    struct timeval start, end;
    struct rusage usage;
    double runTime;

    getrusage(RUSAGE_SELF, &usage);
    // start = usage.ru_stime; // 이것은 system CPU time
    start = usage.ru_utime; // 이것은 user CPU time
    ... // 수행할 내용
    getrusage(RUSAGE_SELF, &usage);
    // end = usage.ru_stime;
    end = usage.ru_utime;

    runTime = (end.tv_sec - start.tv_sec) * 1000.0 + (end.tv_usec - start.tv_usec) / 1000.0; // 단위는 ms
}
3) clock_gettime 이용 방법 - Wall-clock Time 및 Process Time 방식
주의: 링크 시에 rt 라이브러리가 필요하다. gcc에서는 -lrt 옵션을 주면 된다.
#include <time.h>

int main(void)
{
    struct timespec start, end;
    double run_time;

    clock_gettime(CLOCK_REALTIME, &start); // Wall-clock time
    // clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start); // Process time
    ... // 수행할 내용
    clock_gettime(CLOCK_REALTIME, &end); // Wall-clock time
    // clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end); // Process time

    run_time = (end.tv_sec - start.tv_sec) * 1000.0 + (end.tv_nsec - start.tv_nsec) / 1000000.0; // 단위는 ms
}
Reference
  1. http://www.songho.ca/misc/timer/timer.html
  2. http://sunyzero.tistory.com/161

댓글 없음:

댓글 쓰기