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 で確認) では、インライン アセンブリを利用し、マシンのクロック速度をハードワイヤードするという回避策が存在します。
カスタム <クロック>実装 (インテル固有): カスタム の使用: 以上がC でクロスプラットフォームの高解像度タイマーを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。#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);