>백엔드 개발 >C++ >`std::chrono::high_solution_clock`의 정밀도가 측정된 값과 다른 이유는 무엇입니까?

`std::chrono::high_solution_clock`의 정밀도가 측정된 값과 다른 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-09 06:14:02368검색

Why Does `std::chrono::high_resolution_clock`'s Precision Differ from Measured Values?

std::chrono::high_solution_clock의 정확도가 측정값과 일치하지 않는 이유는 무엇인가요?

문제:

다음 테스트 프로그램에서 프로그램은 std::cout의 실행 시간을 측정하려고 시도하지만 얻은 측정 결과는 그렇지 않습니다. 일관되며 항상 1~2마이크로초입니다. 이는 std::chrono::high_solution_clock의 정밀도가 100나노초가 아닌 것 같거나, std::cout 실행 시간을 측정하는 코드에 문제가 있기 때문입니다.

#include <iostream>
#include <chrono>

using std::chrono::nanoseconds;
using std::chrono::duration_cast;

int main()
{
    std::cout << "Resolution (nano) = " << (double) std::chrono::high_resolution_clock::period::num / 
                                          std::chrono::high_resolution_clock::period::den * 
                                          1000 * 1000 * 1000 << std::endl;

    auto t1 = std::chrono::high_resolution_clock::now();
    std::cout << "How many nanoseconds does std::cout take?" << std::endl;
    auto t2 = std::chrono::high_resolution_clock::now();

    auto diff = t2 - t1;
    nanoseconds ns = duration_cast<nanoseconds>(diff);

    std::cout << "std::cout takes " << ns.count() << " nanoseconds" 
              << std::endl;
}

답변:

Visual Studio 2012에서 std::chrono::high_solution_clock은 system_clock으로 정의되어 정확도가 떨어집니다(약 1ms). ). 정확성을 높이기 위해 다음과 같은 사용자 정의 고해상도 시계를 사용할 수 있습니다:

HighResClock.h

struct HighResClock
{
    typedef long long                              rep;
    typedef std::nano                              period;
    typedef std::chrono::duration<rep, period>     duration;
    typedef std::chrono::time_point<HighResClock>  time_point;
    static const bool is_steady = true;

    static time_point now();
};

HighResClock.cpp

namespace
{
    const long long g_Frequency = []() -> long long
    {
        LARGE_INTEGER frequency;
        QueryPerformanceFrequency(&amp;frequency);
        return frequency.QuadPart;
    }();
}

HighResClock::time_point HighResClock::now()
{
    LARGE_INTEGER count;
    QueryPerformanceCounter(&amp;count);
    return time_point(duration(count.QuadPart * static_cast<rep>(period::den) / g_Frequency));
}

이 시계는 고정밀 시간 측정을 위해 std::chrono::high_solution_clock 대신 사용할 수 있습니다.

위 내용은 `std::chrono::high_solution_clock`의 정밀도가 측정된 값과 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.