No Rules Rules
STL chrono (feat. c++, time_since_epoch, system_clock, nanoseconds) 본문
STL chrono (feat. c++, time_since_epoch, system_clock, nanoseconds)
개발하는 완두콩 2022. 7. 20. 13:40chrono는 사전적인 의미 그대로 시간을 나타내는 영단어입니다.
기존 C언어에서는 이미 시간과 관련된 기능을 제공하고 있습니다. (time 함수)
하지만 STL의 chrono는 time 함수보다 더 다양한 기능을 제공하고, 가장 중요한 것은 측정 가능한 시간의 단위가 nanoseconds라는 점입니다.
주로 사용하는 기능에 대해서 열거해보겠습니다.
이 기능(function)이 수행되는 총 시간은?
어떤 함수를 구현했다고 했을때, 과연 이 함수를 통과하는데 총 얼마만큼의 시간이 걸리는지 측정해야 할때가 있습니다.
#include <chrono>
#include <iostream>
void SomethingToDo()
{
...
}
int main()
{
// std::chrono::system_clock::time_point start_time = std::chrono::system_clock::now();
auto start_time = std::chrono::system_clock::now();
SomethingToDo();
// std::chrono::system_clock::time_point start_time = std::chrono::system_clock::now();
auto end_time = std::chrono::system_clock::now();
// std::chrono::duration diff_time = end_time - start_time;
auto diff_time = end_time - start_time;
std::chrono::seconds seconds = std::chrono::duration_cast<std::chrono::seconds>(diff_time);
std::chrono::milliseconds milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(diff_time);
std::chrono::microseconds microseconds = std::chrono::duration_cast<std::chrono::microseconds>(diff_time);
std::chrono::nanoseconds nanoseconds = std::chrono::duration_cast<std::chrono::nanoseconds>(diff_time);
std::cout << "diff_time(sec) : " << seconds.count() << std::endl;
std::cout << "diff_time(ms) : " << milliseconds.count() << std::endl;
std::cout << "diff_time(us) : " << microseconds.count() << std::endl;
std::cout << "diff_time(ns) : " << nanoseconds.count() << std::endl;
return 0;
}
위와 같이 SomethingToDo 함수를 수행하는데 걸린 시간을 여러 시간단위로 확인할 수 있습니다.
물론 system_clock 외에도 high_resolution_clock 등이 존재하지만, 결국 system_clock을 상속받아 사용하는 system_clock의 종류일 뿐입니다.
지금은 몇년도 몇월 몇일일까?
C언어에서 지원하는 time함수를 통해 우리는 년월일 시분초 를 알수 있습니다. 하지만 간혹 더 정밀한 현재시간이 필요한 경우도 있습니다. 이런 경우, chrono를 이용하여 정밀한 현재시간 측정이 가능합니다.
#include <chrono>
#include <iostream>
int main()
{
auto current_time = std::chrono::system_clock::now();
std::time_t current_time_t = std::chrono::system_clock::to_time_t(current_time);
std::cout << "now is " << std::ctime(¤t_time_t);
return 0;
}
단순하게 현재 시간 (초단위)을 알고 싶다면 이렇게 단순하게 사용할 수도 있습니다. 물론 아래처럼 지정된 char* 형식으로 출력됩니다.
now is Thu Jun 2 09:25:26 2022
날짜와 시간의 모든 정보를 각각 핸들링 하고 싶다면 아래처럼 변경할 수도 있습니다.
#include <chrono>
#include <iostream>
void MakeLocalTime(std::tm* const time)
{
time->tm_year += 1900;
time->tm_mon += 1;
time->tm_hour += 9;
std::cout << time->tm_year << "." << time->tm_mon << "." << time->tm_mday << " " << time->tm_hour << ":" << time->tm_min << ":" << time->tm_sec << std::endl;
}
int main()
{
auto current_time = std::chrono::system_clock::now();
std::chrono::system_clock::duration epoch_time = current_time.time_since_epoch();
std::time_t current_time_t = std::chrono::system_clock::to_time_t(current_time);
double diff_time = epoch_time.count() - (current_time_t * 1e9);
MakeLocalTime(std::localtime(¤t_time_t));
std::cout << "diff_time : " << static_cast<long long>(diff_time) << std::endl;
long long millisecond_part, microsecond_part, nanosecond_part;
millisecond_part = static_cast<long long>(diff_time / 1e6);
diff_time -= millisecond_part * 1e6;
microsecond_part = static_cast<long long>(diff_time / 1e3);
diff_time -= microsecond_part * 1e3;
nanosecond_part = static_cast<long long>(diff_time);
std::cout << "millisecond_part : " << millisecond_part << std::endl;
std::cout << "microsecond_part : " << microsecond_part << std::endl;
std::cout << "nanosecond_part : " << nanosecond_part << std::endl;
return 0;
}
2022.6.2 19:4:30
diff_time : 575861760
millisecond_part : 575
microsecond_part : 861
nanosecond_part : 760
time_since_epoch()?
epoch란 UTC. 즉, 1970년 1월 1일 0시 0분 0초부터 현재까지의 시간을 의미합니다.
time함수에 의한 time_t는 초단위의 시간이 담기지만, chrono의 time_since_epoch는 나노초단위의 시간이 담겨있습니다.
그래서 diff_time은 초단위 미만의 시간 정보가 담기게 됩니다.
여담으로 왜 1970년 1월 1일일까? 에 대해서는 평소 생각하지 않았는데, 이번 기회에 검색을 해봤습니다. 그런데 역시나 뚜렷한 정답을 찾지는 못했네요.
다음은 STL 중 가장 많이 사용되는 vector에 대해서 얘기해보겠습니다.
'언어 > STL' 카테고리의 다른 글
STL map 내맘대로 sort (feat. c++, map, pair, value) (0) | 2022.09.21 |
---|---|
STL tuple (feat. c++, make_tuple, tuple_size, tuple_cat) (0) | 2022.07.20 |
STL pair (feat. c++, make_pair) (0) | 2022.07.20 |
STL이란? (feat. Modern C++) (0) | 2022.07.20 |