"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 기본 clock_gettime 지원 없이 Windows에서 나노초 정밀도 타이밍을 어떻게 달성할 수 있습니까?

기본 clock_gettime 지원 없이 Windows에서 나노초 정밀도 타이밍을 어떻게 달성할 수 있습니까?

2024-11-07에 게시됨
검색:995

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

clock_gettime을 Windows로 포팅

clock_gettime 함수는 나노초 정밀도로 현재 시간을 얻는 방법을 제공하는 POSIX 표준 함수입니다. 그러나 Windows에서는 기본적으로 지원되지 않습니다.

Windows로 코드 이식

clock_gettime을 사용하는 코드를 Windows로 이식하려면 Win32를 사용하여 대체 기능을 구현하면 됩니다. API. 다음은 이 작업을 수행하는 방법에 대한 예입니다.

#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(&s, &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(&performanceFrequency);
        if (usePerformanceCounter) {
            QueryPerformanceCounter(&offset);
            frequencyToMicroseconds = (double)performanceFrequency.QuadPart / 1000000.;
        } else {
            offset = getFILETIMEoffset();
            frequencyToMicroseconds = 10.;
        }
    }
    if (usePerformanceCounter) QueryPerformanceCounter(&t);
    else {
        GetSystemTimeAsFileTime(&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);
}

대체 기능을 구현한 후에는 코드에서 이를 사용하여 나노초 정밀도로 현재 시간을 얻을 수 있습니다. 다양한 플랫폼에서 clock_gettime 동작의 차이를 설명하기 위해 코드를 추가로 수정해야 할 수도 있습니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3