Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Melaksanakan Pemasa Resolusi Tinggi Cross-Platform dalam C?

Bagaimana untuk Melaksanakan Pemasa Resolusi Tinggi Cross-Platform dalam C?

Barbara Streisand
Lepaskan: 2024-12-13 02:39:10
asal
543 orang telah melayarinya

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

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 , yang menyediakan sokongan merentas platform untuk pemasa resolusi tinggi. Begini cara anda boleh mencapainya:

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';
}
Salin selepas log masuk

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.

Pelaksanaan (Khusus 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();
};
Salin selepas log masuk

Menggunakan :

using std::chrono::nanoseconds;
using std::chrono::duration_cast;
auto t0 = clock::now();
auto t1 = clock::now();
nanoseconds ns = duration_cast<nanoseconds>(t1 - t0);
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan