Pemasa Resolusi Tinggi Merentas Platform dalam C
Melaksanakan mekanisme pemasa mudah dalam C yang berfungsi pada Windows dan Linux dengan ketepatan milisaat adalah tugas biasa. Untuk menangani perkara ini, C 11 memperkenalkan
Menggunakan
#include <iostream> #include <chrono> #include "chrono_io" // For ease of I/O int main() { typedef std::chrono::high_resolution_clock Clock; auto t1 = Clock::now(); auto t2 = Clock::now(); std::cout << t2 - t1 << '\n'; }
Ketepatan Yang Dipertingkatkan dengan Penyelesaian:
Walau bagaimanapun, jika anda menghadapi kependaman tinggi dalam panggilan berikutnya ke std::chrono::high_resolution_clock (seperti yang diperhatikan pada VS11), wujud penyelesaian yang menggunakan pemasangan sebaris dan wayar keras kelajuan jam mesin.
Menggunakan Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Pemasa Resolusi Tinggi Cross-Platform dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!#include <chrono>
struct clock {
typedef unsigned long long rep;
typedef std::ratio<1, 2800000000> period; // Machine-specific clock speed
typedef std::chrono::duration<rep, period> duration;
typedef std::chrono::time_point<clock> time_point;
static const bool is_steady = true;
static time_point now() noexcept {
unsigned lo, hi;
asm volatile("rdtsc" : "=a"(lo), "=d"(hi));
return time_point(duration(static_cast<rep>(hi) << 32 | lo));
}
static bool check_invariants() {
static_assert(1 == period::num, "period must be 1/freq");
static_assert(std::is_same<rep, duration::rep>::value,
"rep and duration::rep must be the same type");
static_assert(std::is_same<period, duration::period>::value,
"period and duration::period must be the same type");
static_assert(std::is_same<duration, time_point::duration>::value,
"duration and time_point::duration must be the same type");
return true;
}
static const bool invariants = check_invariants();
};
using std::chrono::nanoseconds;
using std::chrono::duration_cast;
auto t0 = clock::now();
auto t1 = clock::now();
nanoseconds ns = duration_cast<nanoseconds>(t1 - t0);