Rumah > pembangunan bahagian belakang > C++ > Mengapa Ketepatan `std::chrono::high_resolution_clock` Berbeza daripada Nilai Terukur?

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

Patricia Arquette
Lepaskan: 2024-11-09 06:14:02
asal
448 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!

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