[C++] std chrono
프로그램을 작성하다보면 어떤 함수가 걸린 시간을 로그로 저장해야 한다던가, 네트워크 장애가 생겼는지 판단하는 등의 여러 상황에서 시간을 측정해야 할 상황이 생긴다. 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 < 2) return 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 |
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<int, std::ratio<1, 1234>>; 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 |