Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `std::chrono::high_resolution_clock` Menunjukkan Percanggahan Walaupun Resolusi Nanosaat?

Mengapakah `std::chrono::high_resolution_clock` Menunjukkan Percanggahan Walaupun Resolusi Nanosaat?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-09 19:08:02249semak imbas

Why Does `std::chrono::high_resolution_clock` Show Discrepancies Despite Nanosecond Resolution?

std::chrono::high_resolution_clock Percanggahan Resolusi

Walaupun menetapkan resolusi nanosaat untuk std::chrono::high_resolution_clock, percanggahan timbul semasa mengukur selang masa. Ini boleh dilihat dalam program ujian yang disediakan di mana masa yang dilaporkan diambil oleh std::cout tidak tepat dalam julat resolusi yang dijangkakan.

Menyelesaikan Percanggahan

The punca percanggahan ini terletak pada pelaksanaan std::chrono::high_resolution_clock pada Visual Studio 2012. Di bawah ini persekitaran, high_resolution_clock ditakrifkan sebagai alias untuk system_clock, yang mempunyai resolusi sekitar 1 milisaat.

Fix for Visual Studio 2012

Untuk mendapatkan pemasa resolusi tinggi yang benar-benar tinggi pada Visual Studio 2012, pelaksanaan jam resolusi tinggi tersuai ialah disyorkan:

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(&frequency);
        return frequency.QuadPart;
    }();
}

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

Penggunaan Tersuai Jam

HighResClock tersuai boleh digunakan sebagai ganti std::chrono::high_resolution_clock dengan fungsi yang sama. Dengan menggunakan QueryPerformanceCounter secara langsung, ia menyediakan pemasaan resolusi tinggi yang tepat.

Atas ialah kandungan terperinci Mengapakah `std::chrono::high_resolution_clock` Menunjukkan Percanggahan Walaupun Resolusi Nanosaat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn