COMPUTING

[리눅스/C] clock_gettime 나노(ns) 단위 시간 측정

Exeter 2023. 8. 23. 23:01
반응형

 

 

리눅스에서 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;
}
 

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

 

 

리눅스 - C언어 정밀 시간 측정 방법

 

 

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

 

 

작성자 스스로 조사하고 작성한 내용으로, 제공된 정보에 대한 법적인 책임을 지지 않습니다.

또한 게시된 정보는 무단으로 배포/복제할 수 없습니다.

내용에 오류가 있는 경우 댓글로 부탁합니다.

 

 

공감(하트)을 눌러주세요! 정보 공유에 큰 힘이 됩니다.

 

반응형