No Rules Rules

STL chrono (feat. c++, time_since_epoch, system_clock, nanoseconds) 본문

언어/STL

STL chrono (feat. c++, time_since_epoch, system_clock, nanoseconds)

개발하는 완두콩 2022. 7. 20. 13:40
728x90
반응형

chrono는 사전적인 의미 그대로 시간을 나타내는 영단어입니다.

https://namu.wiki/w/Chrono

 

기존 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(&current_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(&current_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일일까? 에 대해서는 평소 생각하지 않았는데, 이번 기회에 검색을 해봤습니다. 그런데 역시나 뚜렷한 정답을 찾지는 못했네요.

 

Why is 1/1/1970 the "epoch time"?

Why is 1 January 1970 00:00:00 considered the epoch time?

stackoverflow.com

다음은 STL 중 가장 많이 사용되는 vector에 대해서 얘기해보겠습니다.

728x90
반응형
Comments