Heim > Backend-Entwicklung > C++ > Wie implementiert man einen plattformübergreifenden hochauflösenden Timer in C?

Wie implementiert man einen plattformübergreifenden hochauflösenden Timer in C?

Barbara Streisand
Freigeben: 2024-12-13 02:39:10
Original
466 Leute haben es durchsucht

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

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 ein, das plattformübergreifende Unterstützung für hochauflösende Timer bietet. So können Sie dies erreichen:

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';
}
Nach dem Login kopieren

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 Implementierung (Intel-spezifisch):

#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();
};
Nach dem Login kopieren

Verwendung der benutzerdefinierten :

using std::chrono::nanoseconds;
using std::chrono::duration_cast;
auto t0 = clock::now();
auto t1 = clock::now();
nanoseconds ns = duration_cast<nanoseconds>(t1 - t0);
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage