ホームページ > バックエンド開発 > C++ > C でクロスプラットフォームの高解像度タイマーを実装するにはどうすればよいですか?

C でクロスプラットフォームの高解像度タイマーを実装するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-13 02:39:10
オリジナル
452 人が閲覧しました

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

C でのクロスプラットフォーム高解像度タイマー

Windows と Linux の両方でミリ秒の精度で動作するシンプルなタイマー メカニズムを C で実装します。は一般的なタスクです。これに対処するために、C 11 では、高解像度タイマーのクロスプラットフォーム サポートを提供する を導入しました。これを実現する方法は次のとおりです:

の使用:

#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';
}
ログイン後にコピー

回避策による精度の向上:

ただし、その後の呼び出しで長い遅延が発生した場合は、 std::chrono::high_resolution_lock (VS11 で確認) では、インライン アセンブリを利用し、マシンのクロック速度をハードワイヤードするという回避策が存在します。

カスタム <クロック>実装 (インテル固有):

#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);
ログイン後にコピー

以上がC でクロスプラットフォームの高解像度タイマーを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート