C/C++에서 코드의 실행 시간을 아주 정밀하게 측정해야 할 때가 있습니다. 이럴 때 유용한 것이 바로 C++11부터 표준에 포함된 chrono 라이브러리입니다.
chrono 라이브러리란?
chrono는 시간 관련 기능을 다루는 C++ 표준 라이브러리로, 그중 high_resolution_clock은 운영체제가 제공하는 가장 높은 해상도의 클럭입니다. 이 클럭은 나노초(nanosecond) 단위까지 측정할 수 있어, 짧은 코드 구간의 성능을 분석하는 데 적합합니다.
측정 원리
측정 방식은 간단합니다. 측정하려는 코드가 시작되기 직전에 현재 시각을 한 번 기록하고, 코드가 끝난 직후 다시 시각을 기록한 뒤 두 값의 차이를 계산하면 경과 시간을 얻을 수 있습니다.
예제 코드
아래 예제에서는 2억 번 반복되는 빈 루프를 실행하여 의도적으로 시간을 소모시키고, 그 동안 걸린 시간을 나노초 단위로 출력합니다.
#include <iostream>
#include <chrono>
typedef std::chrono::high_resolution_clock Clock;
int main() {
// 시작 시점 기록
auto start_time = Clock::now();
// 빈 반복문으로 시간 지연 발생
for (int i = 0; i < 200000000; i++) {
;
}
// 종료 시점 기록
auto end_time = Clock::now();
// 두 시점의 차이를 나노초 단위로 변환하여 출력
std::cout << "Time difference: "
<< std::chrono::duration_cast<std::chrono::nanoseconds>(end_time - start_time).count()
<< " nanoseconds" << std::endl;
return 0;
}실행 결과
Time difference: 536395307 nanoseconds
출력 결과를 보면 약 5억 3천만 나노초, 즉 약 0.53초가 걸렸음을 알 수 있습니다. 실행 환경이나 컴파일러 최적화 옵션에 따라 값은 달라질 수 있습니다.
핵심 정리
- high_resolution_clock: 나노초 수준의 고해상도 시간 측정에 사용되는 클럭입니다.
- Clock::now(): 호출 시점의 현재 시각을 반환합니다.
- duration_cast<std::chrono::nanoseconds>: 두 시점의 차이를 나노초 단위로 변환합니다.
- .count(): 변환된 duration 값을 정수 형태로 얻습니다.
참고로 밀리초나 마이크로초 단위가 필요하다면 std::chrono::milliseconds, std::chrono::microseconds로 변경하기만 하면 되므로, 상황에 맞게 단위를 조절해 사용하면 됩니다.