Plattformübergreifender hochauflösender Timer in C
Implementierung eines einfachen Timer-Mechanismus in C, der sowohl unter Windows als auch Linux mit Millisekundengenauigkeit funktioniert ist eine gemeinsame Aufgabe. Um dieses Problem zu lösen, führt C 11
Verwendung von
#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'; }
Verbesserte Präzision mit Workaround:
Wenn jedoch bei nachfolgenden Aufrufen von std::chrono::high_resolution_clock (as.) eine hohe Latenz auftritt beobachtet bei VS11), gibt es eine Problemumgehung, die Inline-Assembly nutzt und die Taktrate der Maschine fest verdrahtet.
Benutzerdefiniert Verwendung der benutzerdefinierten Das obige ist der detaillierte Inhalt vonWie implementiert man einen plattformübergreifenden hochauflösenden Timer in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!#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);