1. ホーム
  2. linux

[解決済み] gettimeofday()はマイクロ秒の分解能が保証されていますか?

2022-12-01 09:13:40

質問

私は、もともと Win32 API 用に書かれたゲームを Linux に移植しています (つまり、Win32 移植版の OS X 移植版を Linux に移植しているのです)。

私は QueryPerformanceCounter を、プロセス起動からのuSecondsを与えることで実装しています。

BOOL QueryPerformanceCounter(LARGE_INTEGER* performanceCount)
{
    gettimeofday(&currentTimeVal, NULL);
    performanceCount->QuadPart = (currentTimeVal.tv_sec - startTimeVal.tv_sec);
    performanceCount->QuadPart *= (1000 * 1000);
    performanceCount->QuadPart += (currentTimeVal.tv_usec - startTimeVal.tv_usec);

    return true;
}

これと QueryPerformanceFrequency() は、周波数として一定の 1000000 を与えることで、うまく機能します。 私のマシンでは を含む 64 ビット変数を与えます。 uSeconds を含む 64 ビット変数を与えています。

そこで はポータブルなのでしょうか? カーネルがある方法でコンパイルされた場合、異なる動作をすることが判明したとか、そういうことは避けたいのです。しかし、Linux 以外のものには移植不可能であっても構いません。

どのように解決するのですか?

そうかもしれません。しかし、もっと大きな問題があります。 gettimeofday() は、システム上にタイマーを変更するプロセス (例えば、ntpd) がある場合、不正確なタイミングになることがあります。しかし、quot;normal" linuxでは、私は gettimeofday() は10usです。それは前方および後方にジャンプすることができ、時間は、結果的に、あなたのシステム上で実行されているプロセスに基づいています。これは事実上、質問の答えをノーにしています。

を調べる必要があります。 clock_gettime(CLOCK_MONOTONIC) を見てください。これは、マルチコア システムや外部クロック設定などのために、いくつかの少ない問題に悩まされています。

また clock_getres() 関数も見てください。