Mengapa Ketepatan `std::chrono::high_resolution_clock` Berbeza daripada Nilai Terukur?

Patricia Arquette
Lepaskan: 2024-11-09 06:14:02
asal
317 orang telah melayarinya

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

Mengapakah ketepatan std::chrono::high_resolution_clock tidak sepadan dengan nilai yang diukur?

Masalah:

Dalam program ujian berikut, program cuba mengukur masa pelaksanaan std::cout, tetapi keputusan pengukuran yang diperolehi tidak konsisten dan sentiasa 1 atau 2 mikrosaat. Ini kerana ketepatan std::chrono::high_resolution_clock nampaknya tidak 100 nanosaat, atau terdapat masalah dengan kod yang mengukur masa pelaksanaan 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;
}
Salin selepas log masuk

Jawapan:

Dalam Visual Studio 2012, std::chrono::high_resolution_clock ditakrifkan sebagai system_clock, yang mengakibatkan ketepatan yang lemah (lebih kurang 1 ms ). Untuk ketepatan yang lebih tinggi, jam beresolusi tinggi tersuai berikut boleh digunakan:

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();
};
Salin selepas log masuk

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));
}
Salin selepas log masuk

Jam ini boleh digunakan sebagai ganti std::chrono::high_resolution_clock untuk pengukuran masa ketepatan tinggi.

Atas ialah kandungan terperinci Mengapa Ketepatan `std::chrono::high_resolution_clock` Berbeza daripada Nilai Terukur?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan