Minuterie haute résolution multiplateforme en C
Implémentation d'un mécanisme de minuterie simple en C qui fonctionne à la fois sous Windows et Linux avec une précision de la milliseconde est une tâche courante. Pour résoudre ce problème, C 11 introduit
Utilisation de
#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'; }
Précision améliorée avec une solution de contournement :
Cependant, si vous rencontrez une latence élevée lors des appels ultérieurs à std::chrono::high_resolution_clock (comme observé sur VS11), il existe une solution de contournement qui utilise l'assemblage en ligne et câble la vitesse d'horloge de la machine.
Personnalisé Utilisation de l' Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!#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);