최근에 긴 프로젝트를 마치고 결과 보고서를 쓰면서 시간 측정을 많이 했다. visual studio로 시간 측정을 하면 C 기반의 시간 측정 함수를 만들어서 쓰곤 했는데, C++11부터 생긴 chrono 시간 라이브러리를 알게 되었고 이를 사용하여 시간 측정을 하였다. 입무 시간에는 빠르게 만들어서 결과만 뽑으려고 코드 정리를 안 했는데, 이번 기회에 시간 측정 클래스로 구현해서 자주 끌어다 쓸 예정이다!
chrono 라이브러리
크로노라고 부르는 이 시간 라이브러리는 크로노스라는 시간의 신에서 유래되었다. C++11이라 나름 세련된? 이름을 가진 라이브러리다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
#include <chrono>
using namespace std;
// 시간 측정 클래스 시작
class Timer
{
using clock_t = std::chrono::high_resolution_clock;
using second_t = std::chrono::duration<double, std::ratio<1>>;
std::chrono::time_point<clock_t> start_time = clock_t::now();
public:
void elapsed()
{
std::chrono::time_point<clock_t> end_time = clock_t::now();
cout << std::chrono::duration_cast<second_t>(end_time - start_time).count() << endl;
}
}; // 시간 측정 클래스 끝
int main()
{
random_device rnd_device;
mt19937 mersenne_engine{ rnd_device() };
vector<int> vec(10);
for (unsigned int i = 0; i < vec.size(); ++i)
vec[i] = i;
std::shuffle(begin(vec), end(vec), mersenne_engine);
for (auto& e : vec) cout << e << " ";
cout << endl;
Timer timer; // 시간 측정 시작
std::sort(begin(vec), end(vec));
timer.elapsed(); // 시간 측정 끝
for (auto& e : vec) cout << e << " ";
cout << endl;
return 0;
}
간단한 정렬 예제를 가지고 왔다. 일반적인 작동 방식은 시간을 측정하고 싶은 곳에 인스턴스를 생성하여 시작 시간을 저장하고 끝나는 부분에서 elapsed 멤버 함수를 불러서 끝 시간을 저장하여 총 걸린 시간을 출력한다.
using clock_t = std::chrono::high_resolution_clock;
클래스 가장 첫줄에 위와 같은 명령문을 볼 수 있는데, 최대한 정밀도를 높여서 시간을 측정하기 위함이다. using 사용에 대해 모르겠다면 이전 포스팅 링크를 참고하자!
또한 시간 측정은 Release와 Debug에서 차이가 나는데, 프로그램을 개발하면 Release 모드로 배포하니 Release 모드로 측정해서 내 프로그램의 시간을 측정하자! Debug 모드가 시간이 더 오래 걸린다!
Reference
'Programming Language > Modern C++' 카테고리의 다른 글
[C++ 11] 열거형 클래스 enum class (0) | 2021.12.04 |
---|---|
[C++ 11] auto 키워드와 자료형 추론 (0) | 2021.11.15 |
[C++ 11] typedef와 using 키워드의 차이점 (0) | 2021.11.09 |
[C++ 14] 가독성 높은 비트 마스크 표현 (0) | 2021.11.06 |
[C++ 11] for문 간결하게 쓰기(auto 키워드) (0) | 2021.10.31 |