C++에서 나노초(nanosecond) 단위의 정밀한 시간 측정이 필요하다면 chrono 라이브러리를 활용하는 것이 가장 좋은 방법입니다. 이 라이브러리에는 high_resolution_clock이라는 고해상도 시계가 내장되어 있어, 매우 짧은 시간 간격까지 정확하게 측정할 수 있습니다.
기본적인 원리는 다음과 같습니다. 코드 실행이 시작되는 지점에서 현재 시각을 기록하고, 코드가 끝나는 지점에서 다시 시각을 기록한 뒤, 두 값의 차이를 계산하여 경과 시간(elapsed time)을 구합니다. 아래 예제에서는 대기 효과를 주기 위해 일부러 빈 반복문(empty loop)을 사용했습니다.
예제 코드
#include <iostream>
#include <chrono>
typedef std::chrono::high_resolution_clock Clock;
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;
}실행 결과
Time difference: 536395307 nanoseconds
코드 설명
1. Clock::now() — high_resolution_clock의 정적 함수로, 호출된 순간의 현재 시점(time point)을 반환합니다. 시작과 끝 두 지점에서 각각 호출됩니다.
2. end_time - start_time — 두 time point의 차이는 duration 객체로 계산되며, 이 값은 곧바로 출력할 수 없으므로 변환이 필요합니다.
3. duration_cast<nanoseconds> — 측정된 duration을 나노초 단위로 강제 변환한 뒤, .count() 함수로 정수형 값을 추출하여 출력합니다.
컴파일 및 실행 (Linux)
Linux 환경에서는 g++ 컴파일러를 사용해 다음과 같이 빌드할 수 있습니다. C++11 이상의 표준을 지정하는 것이 좋습니다.
g++ -std=c++11 timer.cpp -o timer ./timer
참고 사항
일부 컴파일러 환경에서는 high_resolution_clock이 system_clock의 별칭(alias)으로 정의되어 있어 시스템 시간 변경의 영향을 받을 수 있습니다. 순수하게 경과 시간만 측정하고 싶다면 steady_clock을 사용하는 것이 더 안전한 선택입니다. 또한 최적화 옵션(-O2 등)을 적용하면 빈 반복문이 제거될 수 있으므로, 벤치마킹 목적이라면 반복문 내부에 실제 연산을 넣는 것이 좋습니다.