컴퓨터

[리눅스/C] clock_gettime 함수로 나노(ns) 단위 시간 측정 하기

real-blog 2023. 8. 13. 11:54
반응형

 

 

리눅스에서 C/C++로 프로그램 구현 시 정밀한 시간 측정을 위한 방법관련된 게시입니다.

 

일반적으로 시간을 구하는 함수는 많지만 그 정밀도가 수십 밀리세컨드(ms)로, 더욱 정밀한 시간차를 측정하기에는 적절하지 않습니다.

 

 

 

clock_gettime 함수는 리눅스(Linux) 환경에서 특정 구간 내에서 실행되는 코드의 정밀한 시간차를 구하려고 할 때 사용할 수 있는 함수입니다.

 

clock_gettime 함수는 나노초 단위까지의 시간을 구할 수 있다고 합니다.

 

 

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

 기호 단위 의미
 m   milli  10(-3)
 µ   micro  10(-6)
n  nano  10(-9)

 

 

 

clock_gettime 함수에서 리턴하는 구조체 형태는 아래와 같습니다.

센컨드(초) 단위 및 나노세컨드(ns) 단위의 리턴값을 갖습니다.

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;
}
 

의견은 댓글로 부탁드립니다.

 

 

 

 

--------------------------

 

본 블로그는 개인의 경험을 공유하고, 유익한 정보 제공을 목적으로 작성된 글입니다.

특정 자료로부터 발췌한 자료는 출처가 표기되어 있습니다. 

 

모든 글은 링크 복사만이 허용되며 모든 불펌을 금지합니다.

 

공감(하트)을 눌러주세요! 블로그 작성에 큰 힘이 됩니다.

반응형