Maison > développement back-end > C++ > Comment implémenter un timer multiplateforme haute résolution en C ?

Comment implémenter un timer multiplateforme haute résolution en C ?

Barbara Streisand
Libérer: 2024-12-13 02:39:10
original
543 Les gens l'ont consulté

How to Implement a Cross-Platform High-Resolution Timer in C  ?

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 , qui fournit une prise en charge multiplateforme pour les minuteries haute résolution. Voici comment y parvenir :

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';
}
Copier après la connexion

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é Implémentation (spécifique à Intel) :

#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();
};
Copier après la connexion

Utilisation de l' personnalisée :

using std::chrono::nanoseconds;
using std::chrono::duration_cast;
auto t0 = clock::now();
auto t1 = clock::now();
nanoseconds ns = duration_cast<nanoseconds>(t1 - t0);
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal