ネイティブの Clock_gettime サポートを使用せずに Windows でナノ秒精度のタイミングを実現するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-10-26 06:10:03
オリジナル
687 人が閲覧しました

How can I achieve nanosecond precision timing on Windows without native clock_gettime support?

Windows への Clock_gettime の移植

Clock_gettime 関数は、ナノ秒の精度で現在時刻を取得する方法を提供する POSIX 標準関数です。ただし、Windows ではネイティブにサポートされていません。

Windows へのコードの移植

Clock_gettime を使用するコードを Windows に移植するには、Win32 を使用して置換関数を実装できます。 API。これを行う方法の例を次に示します。

<code class="C++">#include <Windows.h>

// Returns the file time offset for Windows.
LARGE_INTEGER getFILETIMEoffset() {
    SYSTEMTIME s;
    FILETIME f;
    LARGE_INTEGER t;

    s.wYear = 1970;
    s.wMonth = 1;
    s.wDay = 1;
    s.wHour = 0;
    s.wMinute = 0;
    s.wSecond = 0;
    s.wMilliseconds = 0;
    SystemTimeToFileTime(&amp;s, &amp;f);
    t.QuadPart = f.dwHighDateTime;
    t.QuadPart <<= 32;
    t.QuadPart |= f.dwLowDateTime;
    return (t);
}

// Replacement for clock_gettime function.
int clock_gettime(int X, struct timeval *tv) {
    LARGE_INTEGER t;
    FILETIME f;
    double microseconds;
    static LARGE_INTEGER offset;
    static double frequencyToMicroseconds;
    static int initialized = 0;
    static BOOL usePerformanceCounter = 0;

    if (!initialized) {
        LARGE_INTEGER performanceFrequency;
        initialized = 1;
        usePerformanceCounter = QueryPerformanceFrequency(&amp;performanceFrequency);
        if (usePerformanceCounter) {
            QueryPerformanceCounter(&amp;offset);
            frequencyToMicroseconds = (double)performanceFrequency.QuadPart / 1000000.;
        } else {
            offset = getFILETIMEoffset();
            frequencyToMicroseconds = 10.;
        }
    }
    if (usePerformanceCounter) QueryPerformanceCounter(&amp;t);
    else {
        GetSystemTimeAsFileTime(&amp;f);
        t.QuadPart = f.dwHighDateTime;
        t.QuadPart <<= 32;
        t.QuadPart |= f.dwLowDateTime;
    }

    t.QuadPart -= offset.QuadPart;
    microseconds = (double)t.QuadPart / frequencyToMicroseconds;
    t.QuadPart = microseconds;
    tv->tv_sec = t.QuadPart / 1000000;
    tv->tv_usec = t.QuadPart % 1000000;
    return (0);
}</code>
ログイン後にコピー

置換関数を実装したら、それをコード内で使用して、ナノ秒の精度で現在時刻を取得できます。異なるプラットフォームでの Clock_gettime の動作の違いを考慮して、コードに追加の変更を加える必要がある場合があることに注意してください。

以上がネイティブの Clock_gettime サポートを使用せずに Windows でナノ秒精度のタイミングを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!