Intro
안녕하세요. 이번 포스팅에서는 chrono에 대해 알아보도록 하겠습니다. chorono는 C++11에서 추가된 시간에 관련된 라이브러리입니다.
기존의 C 런타임에서 제공하는 time 함수보다 다양한 기능을 제공하며, 사용이 쉽고 정밀도가 훨씬 높습니다. 또한, time함수는 초 단위의 값만 측정할 수 있는데 반해, chrono는 나노 밀리 초 단위까지 측정이 가능합니다. chrono를 사용하면 OS와는 독립적으로 정밀도가 높은 시간 측정이 가능합니다. 또한, 특정 시간 구간에 걸린 시간을 초, 밀리 초, 나노 초 단위로 얻을 수 있으며 시간끼리도 연산이 가능합니다. 예전에 time 함수를 썼다가 시간이 살짝 어긋난 경험이 있어서... 저 같은 경우 시간 관련 코드를 짤 때 chrono를 사용합니다. chrono를 사용하면 OS와는 독립적으로 정밀도가 높은
chrono
#include <iostream>
#include <chrono>
#include <cmath>
int main(void)
{
std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
int sum = 0;
for (int i = 0;i < 999999999;i++)
sum += i;
std::chrono::duration<double>sec = std::chrono::system_clock::now() - start;
std::cout << "for문을 돌리는데 걸리는 시간(초) : " << sec.count() <<"seconds"<< std::endl;
}
결과
여기서 time_point는 시간상의 한 축을 뜻합니다. for문을 실행하여 다시 현재 시각을 얻은 후에 for문을 시작하기 전 저장한 현재 시각을 빼면 for문을 수행하는 데 걸린 시간을 얻을 수 있습니다.
chrono에서 경과 시 간을 나타낼 때 duration 클래스를 사용하는데, duration은 6가지 시간 단위를 지원합니다.
duration 지원 시간 단위
- std::chrono::nanoseconds : 나노세컨드. 10억 분의 1초
- std::chrono::microseconds : 마이크로 세컨드. 100만 분의 1초
- std::chrono::milliseconds : 밀리 세컨드. 1천 분의 1초
- std::chrono::seconds : 초
- std::chrono::minutes : 분
- std::chrono::hours : 시
clock 클래스
chrono에는 system_clock뿐만 아니라 steady_clock와 high_resolution_clock도 있습니다. system_clock이 가장 일반적으로 사용하는 것으로, 시스템 시간을 나타내고 C 런타임의 time_t와 호환이 가능합니다.
steady_clock은 물리적 시간처럼 결코 역행하지 않는 시간을 나타냅니다. 즉, steady_clock 이외의 clock 클래스는 time_point를 얻은 후 OS에서 날짜를 과거로 되돌린 후에 time_point를 얻으면 앞에 얻은 시간을 얻지만, steady_clock에서는 그럴 수 없습니다. 따라서 시간의 흐름이 바뀌지 않는 시간을 얻고 싶을 때 steady_clock를 사용하면 됩니다.
high_resolution_clock은 Windows 또는 Linux에서 제공하는 정밀도가 가장 높은 시간입니다. 이 클래스는 system_clock이나 steady_clock의 다른 별칭으로 정의되기도 합니다.
chrono를 이용해 timer 만들기
#include <iostream>
#include <chrono>
#include <cmath>
int main(void)
{
auto startTime = std::chrono::system_clock::now();
int Sec = 0;
while (1)
{
auto endTime = std::chrono::system_clock::now();
auto sec = std::chrono::duration_cast<std::chrono::seconds>(endTime - startTime);
if (sec.count() > Sec)
{
Sec++;
std::cout << Sec <<" ";
}
}
}
결과
while문을 무한으로 돌려서 콘솔이 시작될 때 무한으로 초를 제는 카운터를 만들어 봤습니다.
마무리
오늘은 시간 관련 라이브러리 중 하나인 chrono에 대해 포스팅해봤습니다. 예전에 개발 중에 기존의 C 런타임 time 함수를 썼는데.. 시간이 미묘하게 맞지 않아서 고생한 적이 있습니다. 그때 chrono의 time함수를 쓰니 정확도가 훨씬 높았습니다. 그래서 C++에서는 웬만하면 시간 관련 함수는 chrono를 사용합니다.
그럼 이상으로 포스팅을 마치겠습니다. 감사합니다.
'[C++ STL]' 카테고리의 다른 글
[C++ - vector Tuple sort 방법] (0) | 2021.11.16 |
---|---|
[C++ For문에서 Vector erase 사용법 (0) | 2021.11.01 |
[C++ STL - forward_list] (0) | 2021.06.24 |
[STL - 메모리 관리(스마트 포인터 shared_ptr, unique_ptr] (0) | 2021.06.08 |
[C++ STL - tuple] (0) | 2021.05.21 |