C++

[C++] std chrono

얌몽 2019. 1. 19. 01:34

프로그램을 작성하다보면 어떤 함수가 걸린 시간을 로그로 저장해야 한다던가, 네트워크 장애가 생겼는지 판단하는 등의 여러 상황에서 시간을 측정해야 할 상황이 생긴다. chrono 라이브러리는 시간을 측정하기 위한 C++ 11에 지정된 표준 라이브러리다. C++11에서는 nanoseconds 단위 시간 측정이 가능하다. C++20 달력, 파일 시간 접근 등의 여러 부가적인 기능등이 추가될 예정이다.

Chrono 라이브러리는 3가지 주요 기능들로 구성되어 있다.

1. Clocks

시계의 역할을 하는 클래스이다. 여러 클래스가 있는데, 공통적으로 시작 시간과 단위를 가지고 있다. 각 상황에 적절한 클래스를 이용하면 된다. now() 함수를 이용해서 현재의 시간(TimePoint)을 가지고 올 수 있다. 이 중 high_resolution_color 클래스는 nanoseconds 단위로 시간을 나타낸다.

아래는 피보나치 수열 함수를 수행할 때 걸린 시간을 측정한 예시이다.

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <chrono>
#include <ctime>
 
long fibonacci(unsigned n)
{
    if (n < 2return n;
    return fibonacci(n-1+ fibonacci(n-2);
}
 
int main()
{
    auto start = std::chrono::high_resolution_clock::now();
    std::cout << "f(42) = " << fibonacci(42<< '\n';
    auto end = std::chrono::high_resolution_clock::now();
 
    std::chrono::nanoseconds elapsedNS = end-start;
    std::chrono::seconds elpasedSeconds = std::chrono::duration_cast<std::chrono::seconds>(elapsedNS);
    std::time_t end_time = std::chrono::system_clock::to_time_t(end);
 
    std::cout << "finished computation at " << std::ctime(&end_time)
              << "elapsed time NS: " << elapsedNS.count() << "ns\n"
              << "elapsed time S: " << elpasedSeconds.count() << "s\n";
}
cs
Output

1
2
3
4
f(42) = 267914296
finished computation at Fri Jan 18 16:30:32 2019
elapsed time NS: 1490598036ns
elapsed time S: 1s
cs

2. TimePoint

TimePoint는 유닉스 시간(epochTime)으로 부터 얼마나 경과했는지 각 시계의 단위로 표시한다.  유닉스 시간이란 1970년 1월 1일 00:00:00 으로 부터의 경과시간을 의미한다. 

3. Duration

시간 간격을 나타내는 클래스이다. 시간 간격의 변수형을 나타내는 Rep과, 간격이 1초당 나타내는 비율을 템플릿 형태로 가지고 있다. c++11에서는 기본적으로 nanoseconds 부터 hours 단위까지 지원한다. (C++20에서 years 단위까지 확장될 예정이다.)

아래는 1초를 여러 단위로 변경한 예시이다.

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <chrono>
 
int main()
{
    using myTick = std::chrono::duration<intstd::ratio<11234>>;
 
    std::chrono::seconds sec(1);
 
    std::cout << "1 second is:\n";
 
    std::cout << std::chrono::microseconds(sec).count() << " microseconds\n"
              << myTick(sec).count() << " myTick\n";
 
    std::cout << std::chrono::duration_cast<std::chrono::minutes>(sec).count()
              << " minutes\n";
}
cs

Output

1
2
3
4
1 second is:
1000000 microseconds
1234 myTick
0 minutes
cs