프로그램을 작성하다 보면 두가지 기능의 성능을 비교할 때 초단위로 혹은 그보다 정밀한 단위로 시간을 측정해야할 경우가 있다. C++ 11에서는 chrono 라이브러리에서 nanosecond단위의 시간 측정을 지원한다.
예를 들어서 피보나치 수열 함수를 동작하는데 걸리는 시간을 second, millisecond 그리고 nanosecond 단위로 측정해보자.
#include <iostream>
#include <chrono>
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();
fibonacci(40);
auto end = std::chrono::high_resolution_clock::now();
std::chrono::nanoseconds ElapsedNS = end - start;
std::chrono::milliseconds ElapsedMS = std::chrono::duration_cast<std::chrono::milliseconds>(ElapsedNS);
std::chrono::seconds ElapsedS = std::chrono::duration_cast<std::chrono::seconds>(ElapsedNS);
std::cout << "Elapsed time in nanoseconds: " << ElapsedNS.count() << std::endl;
std::cout << "Elapsed time in milliseconds: " << ElapsedMS.count() << std::endl;
std::cout << "Elapsed time in seconds: " << ElapsedS.count() << std::endl;
return 0;
}
결과는 다음과 같이 잘 나온다.
걸린 시간을 각각의 단위로 출력할 때 count()함수를 꼭 붙여줘야 하는걸 잊지 말자. 왜냐하면
using nanoseconds = duration<long long, nano>;
using microseconds = duration<long long, micro>;
using milliseconds = duration<long long, milli>;
using seconds = duration<long long>;
위의 코드에서 볼 수 있듯이 std::chrono::nanoseconds, std::chrono::milliseconds, std::chrono::seconds는 duration으로 정의되어 있는데 duration은 2번째 인자를 기준으로 tick수만 갖고 있는 클래스이다.
따라서 클래스 자체를 출력 못하고, 클래스의 멤버함수인 count를 이용해서 tick수를 반환해야 한다.
Reference
'공부 > C || C++' 카테고리의 다른 글
네임스페이스(namespace)란? std란? (0) | 2021.07.19 |
---|---|
C++ 대입 연산자는 왜 void로 선언하면 안될까? 반환 타입에 왜 참조자를 붙여야 할까? (0) | 2021.07.18 |
C++ 11 default, delete 키워드 (0) | 2021.07.15 |
C++ 11 enum class (0) | 2021.07.10 |
char*를 cout으로 출력할 경우 주소가 올바르게 나오지 않는 경우 (0) | 2021.07.09 |