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

我正在将最初为 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

所以这是可移植的吗?我不想发现如果内核以某种方式或类似的方式编译,它的工作方式会有所不同。不过,我觉得它不能移植到 Linux 以外的东西上。

最佳答案

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

您应该查看 clock_gettime(CLOCK_MONOTONIC) 的时间间隔。由于多核系统和外部时钟设置等原因,它遇到的问题较少。

另外,查看 clock_getres() 函数。

https://stackoverflow.com/questions/88/

相关文章:

python - 如何让 python 的 pprint 返回一个字符串而不是打印?

linux - 使用 unix 命令 "watch"的颜色?

python - 在 Python 字符串中的最后一个分隔符上拆分?

python - 使用 IPython 逐步调试

python - 使用 argparse 需要两个参数之一

python - 如何在 Python 中创建对象的副本?

linux - 如何使用 strace 跟踪子进程?

linux - SIGINT 与 SIGTERM、SIGQUIT 和 SIGKILL 等其他终止信号

mysql - MySQL 服务器和 MySQL 客户端有什么区别

linux - 如何通过将其内存存储到磁盘并稍后恢复它来在 Linux 中 "hibernate"进