一尘不染

gettimeofday()是否保证为微秒分辨率?

linux

我正在将一个最初为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作为频率,可以 在我的机器上
很好地工作,并为我提供了一个uSeconds自程序启动以来包含的64位变量。

是便携式的吗? 我不想发现以某种方式或类似方式编译内核时,它的工作原理有所不同。我可以将其移植到Linux以外的其他软件上,这很好。


阅读 343

收藏
2020-06-02

共1个答案

一尘不染

也许。但是你有更大的问题。gettimeofday()如果系统上有更改计时器的进程(即ntpd),则可能会导致计时不正确。但是,在“普通”
Linux上,我相信的分辨率gettimeofday()为10us。因此,它可以根据系统上运行的进程向前和向后跳转,并可以跳转。有效地回答了您的问题。

您应该查看clock_gettime(CLOCK_MONOTONIC)时间间隔。由于诸如多核系统和外部时钟设置之类的问题,它遇到的问题更少。

另外,查看该clock_getres()功能。

2020-06-02