Rumah >pembangunan bahagian belakang >C++ >Mengapa Ketepatan `std::chrono::high_resolution_clock` Berbeza daripada Nilai Terukur?
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; }
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(); };
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)); }
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!