COMPUTING

[리눅스/C] clock_gettime 함수를 활용 한 정밀한 시간 측정 방법

Exeter 2015. 7. 10. 16:49
반응형

일반적으로 시간을 구하는 함수는 많은데, 일반적으로 그 정밀도가 수십 밀리세컨드로 정밀한 시간차이를 구하기 위해서 사용하기에는 적절하지 않습니다.


clock_gettime 함수는 리눅스 환경에서 코딩할때 특정 구간내에서 실행되는 코드의 정밀한 시간차를 구하려고 할 때 사용할 수 있는 함수 입니다. clock_gettime 함수는 나노초 단위까지의 시간을 구할 수 있다고 합니다.


참고로 SI 단위에서 사용되는 단위와 그 정밀도는 아래와 같습니다.

 기

단위

의미

 m 

 milli

 10-3

 µ 

 micro

 10-6

n

 nano

 10-9



clock_gettime 함수에 대한 자세한 설명은 구글에서 검색하면 다양한 소스 코드가 나옵니다.

이 함수에서 리턴하는 구조체 형태는 아래와 같습니다. 주석에서 볼 수 있듯이 나노단위의 리턴값을 갖습니다.

struct timespec 

{

time_t   tv_sec;        /* seconds */

long     tv_nsec;       /* nanoseconds */

};



아래 소스는 clock_gettime 함수를 적용해서 만들어본 샘플 코드입니다. 주 기능은 특정 구간 앞뒤에서 호출하여 시간차이 값을 계산해서 리턴해줍니다. 

단순 참고용으로 작성되었기 때문에 실전(?)에서 활용하기 위해서는 적절히 수정하면 될 것 같습니다.


참고로 아래 코드는 리턴값으로 밀리 세컨드를 얻기위해 리전 직전에 1,000,000으로 나누어 주었습니다. 

일반적인 용도로 밀리 세컨드(ms) 정도의 해상도(정밀도)면 사용하기에 적절할 것 같습니다.

만약 마이크로 세컨드(µs)의 해상도로 시간차를 얻고 싶다면 1,000 으로 나누어 주면 됩니다.


#include <time.h>


int main()

{

GetTimeDiff(0);

for(int i=0;i<100;i++)

DoSomeThing();

printf("Elapsed Time : %lld \n", GetTimeDiff(1) );

}


long long GetTimeDiff(unsigned int nFlag)
{
    const long long NANOS = 1000000000LL;
    static struct timespec startTS, endTS;
    static long long retDiff = 0;
    if(nFlag == 0)
    {
        retDiff = 0;
        if(-1 == clock_gettime(CLOCK_MONOTONIC, &startTS))
printf("Failed to call clock_gettime\n");
    }
    else
    {
        if(-1 == clock_gettime(CLOCK_MONOTONIC, &endTS))
printf("Failed to call clock_gettime\n");
        retDiff = NANOS * (endTS.tv_sec-startTS.tv_sec) + (endTS.tv_nsec-startTS.tv_nsec);
    }

    return retDiff/1000000;
}


틀린 부분/의견은 댓글로 부탁드립니다.


반응형