Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++와 Linux에서 고해상도 타이머를 만드는 방법 (chrono 라이브러리 활용)

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_clocksystem_clock의 별칭(alias)으로 정의되어 있어 시스템 시간 변경의 영향을 받을 수 있습니다. 순수하게 경과 시간만 측정하고 싶다면 steady_clock을 사용하는 것이 더 안전한 선택입니다. 또한 최적화 옵션(-O2 등)을 적용하면 빈 반복문이 제거될 수 있으므로, 벤치마킹 목적이라면 반복문 내부에 실제 연산을 넣는 것이 좋습니다.