chrono는 C++11에서 새로 추가된 시간 라이브러리입니다. 기존의 C 런타임에서 제공하는
time 함수에 비해서 다양한 기능이 있고, 사용이 쉽고 정밀도는 훨씬 높습니다. time 함수는 초 단위의 값만 측정할 수 있는 것에 비해 chrono는
나노 밀리 초 단위도 측정할 수 있습니다.
현재의 C++(C++03)에서는 초 단위보다 더 정밀한 단위로
시간을 측정할 때는 OS에서 제공하는 API를 사용해야 했는데 chrono를 사용하면 OS 독립적으로 높은 단위의 시간을 측정할
수 있습니다.
VC10에서는 chrono가
들어가지 않았지만 이번 VC11에서 chrono는 STL에 들어갔습니다. 만약
VC11을 사용하지 못하는 경우라면 Boost 라이브러리를 사용하면 사용할 수 있습니다.
chrono를 사용하면 특정 시간 구간에 걸린 시간을 초, 밀리 초, 나노 초 단위로 얻을 수 있으며 또 시간끼리 연산을 할
수 있습니다
chrono 사용 방법
chrono를 사용하기 위해서는 아래의 헤더 파일을 추가합니다.
chrono에 대한 자세한 설명에 앞서 어떤 기능인지 좀 더
쉽게 알 수 있도록 예제를 하나 보여드리겠습니다. 아래의 예제는 어떤 함수의 성능을 측정하기 위해서 chrono를 사용했습니다.
< 예제. 1 >
#include <chrono>
#include <iostream>
#include <cmath>
void Test()
{
for
( long i = 0; i < 10000000; ++i )
{
std::sqrt(
123.456L );
}
}
int main()
{
std::chrono::system_clock::time_point start =
std::chrono::system_clock::now();
Test();
std::chrono::duration<double> sec =
std::chrono::system_clock::now() - start;
std::cout << "Test() 함수를 수행하는 걸린 시간(초) : " << sec.count() << " seconds"
<< std::endl;
return 0;
}
< 실행 결과 >
<예제.1>에서는
std::chrono::system_clock::now()을 사용하여 현재 시간을 얻습니다.
std::chrono::system_clock::time_point
start = std::chrono::system_clock::now();
여기서 time_point 타입은 시간 상의 한 축을 뜻합니다.
이후 Test() 함수를 실행한 후 다시 현재 시간을 얻은 후 Test()를 시작하기 전에 저장한 현지 시간을 빼면 Test()를
수행하는 걸린 시간을 얻을 수 있습니다.
std::chrono::duration<double> sec
= std::chrono::system_clock::now() - start;
* std::chrono::system_clock::now()에
의해서 얻는 시간의 초기 시간은 1970년 입니다.
시간 단위
chrono는 경과 시간을 계산할 때 다양한 시간 타입으로 계산할
수 있습니다.
<예제.1>에서는
초 단위의 정밀도로 소수점까지 표시할 수 있었습니다.
std::chrono::duration<double> sec
= std::chrono::system_clock::now() - start;
그런데 보통은 소수점이 나오는 결과 값보다는 정수로 나오는 값을 사용하는 경우가 많을 것입니다.
chrono에서는 경과 시간을 나타내는 클래스는 duration입니다.
duration은 6개의
시간 단위를 지원합니다.
std::chrono::nanoseconds // 나노 세컨드. 10억분의 1초
std::chrono::microseconds // 마이크로
세컨드. 100만분의 1초
std::chrono::milliseconds // 밀리 세컨드. 1000분의 1초
std::chrono::seconds // 초
std::chrono::minutes // 분
std::chrono::hours // 시
<예제.1>을
수정하여 위에 열거한 chrono의 다양한 단위를 사용하여 시간 측정을 해 보겠습니다.
< 예제. 2 >
#include <chrono>
#include <iostream>
#include <cmath>
void Test()
{
for
( long i = 0; i < 10000000; ++i )
{
std::sqrt(
123.456L );
}
}
int main()
{
std::chrono::system_clock::time_point StartTime =
std::chrono::system_clock::now();
Test();
std::chrono::system_clock::time_point EndTime =
std::chrono::system_clock::now();
std::chrono::duration<double> DefaultSec = EndTime - StartTime;
std::chrono::nanoseconds nano = EndTime - StartTime;
std::chrono::microseconds micro =
std::chrono::duration_cast<std::chrono::microseconds>(EndTime -
StartTime);
std::chrono::milliseconds mill =
std::chrono::duration_cast<std::chrono::milliseconds>(EndTime -
StartTime);
std::chrono::seconds sec =
std::chrono::duration_cast<std::chrono::seconds>(EndTime - StartTime);
std::chrono::minutes min =
std::chrono::duration_cast<std::chrono::minutes>(EndTime - StartTime);
std::chrono::hours hour =
std::chrono::duration_cast<std::chrono::hours>(EndTime - StartTime);
std::cout << "Test() 함수를 수행하는 걸린 시간 :
" << DefaultSec.count() << " default" <<
std::endl;
std::cout << "Test() 함수를 수행하는 걸린 시간 :
" << nano.count() << " nanoseconds" <<
std::endl;
std::cout << "Test() 함수를 수행하는 걸린 시간 :
" << micro.count() << " microseconds" <<
std::endl;
std::cout << "Test() 함수를 수행하는 걸린 시간 :
" << mill.count() << " milliseconds" <<
std::endl;
std::cout << "Test() 함수를 수행하는 걸린 시간 :
" << sec.count() << " seconds" << std::endl;
std::cout << "Test() 함수를 수행하는 걸린 시간 :
" << min.count() << " minutes" << std::endl;
std::cout << "Test() 함수를 수행하는 걸린 시간 :
" << hour.count() << " hour" << std::endl;
return 0;
}
< 실행 결과 >