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
453 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!

sumber:php.cn
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