C++ 프로그래밍

C++ chrono system_clock과 steady_clock의 이해 및 차이점

하늘흐늘 2021. 11. 10. 13:25
반응형

C++ chrono 라이브러리에는 기본적으로 system_clock과 steady_clock 두 개의 시간 측정 클래스가 존재합니다. 두 클래스의 기본적인 개념은 아래와 같습니다.
system_clock은 전통적인 유닉스 타임으로 1970 1월 1일 목요일 0시 0분 0초 이후로 흘러간 시간을 나타냅니다. 그에 반하여 steady_clock은 마지막 부팅 이후로 흘러간 시간을 나타냅니다. 
흔히 하는 이야기로 시계를 표현하기 위해서는 system_clock을, 초시계를 표현하기 위해서는 steady_clock을 사용해야 합니다. 그 이유는 system_clock과 같은 경우 OS 시간 동기화 등에 의하여 시간 측정 중에 시간 값이 변할 수 있기 때문인데 반하여 steady_clock은 그럴 가능성이 없기 때문입니다. 

아래 시간 측정 예제 코드를 살펴보겠습니다.

#include <iostream>
#include <chrono>
#include <thread>

using namespace std;
using namespace std::chrono;

void system_clock_test()
{
	time_point start = system_clock::now();

	this_thread::sleep_for(milliseconds(1000));

	time_point stop = system_clock::now();

	duration  elapsed = stop - start;

	long long miliseconds = duration_cast<milliseconds>(elapsed).count();

	cout << miliseconds << " ms" << endl;
}

void steady_clock_test()
{
	time_point start = steady_clock::now();

	this_thread::sleep_for(milliseconds(1000));

	time_point stop = steady_clock::now();

	duration  elapsed = stop - start;

	long long miliseconds = duration_cast<milliseconds>(elapsed).count();

	cout << miliseconds << " ms" << endl;
}

int main(int argc, char* argv[])
{
	system_clock_test();

	steady_clock_test();

	return 0;
}

결과는 중요하지 않기 때문에 실행 결과는 생략하기로 하겠습니다.
위의 예에서 system_clock_test()와 같은 경우는 시스템 시간의 변경에 의하여 최악의 경우에 -값을 가질 수도 있습니다. 그에 반하여 steady_clock_test()은 그럴 가능성이 없습니다. 

간단한 응용 예를 든다면 게임 서버에서 아이템과 같은 경우는 소유한 이후에 서버 부팅이 일어날 수도 있기 때문에 system_clock_test()을 사용하는 것이 좋습니다. 이에 반하여 스킬 사용시간 같은 경우는 사용 후 장애가 아니고서는 서버 부팅이 일어날 일이 없으므로 steady_clock_test()을 사용하는 것이 좋습니다.

마지막으로 C++로 프로그램 실행 시간을 측정할 때는 버그 가능성 없이 측정하기 위하여 steady_clock을 사용해야 합니다. 위의 예제에서 steady_clock_test()처럼 하면 됩니다.

반응형