공부/C || C++

C++11 chrono

sudo 2021. 7. 16. 18:14

프로그램을 작성하다 보면 두가지 기능의 성능을 비교할 때 초단위로 혹은 그보다 정밀한 단위로 시간을 측정해야할 경우가 있다. 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

https://en.cppreference.com/w/cpp/chrono/duration

 

std::chrono::duration - cppreference.com

template<     class Rep,     class Period = std::ratio<1> > class duration; (since C++11) Class template std::chrono::duration represents a time interval. It consists of a count of ticks of type Rep and a tick period, where the tick period is a compile

en.cppreference.com