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

标签 linux winapi visual-c++ unix timer

我正在将最初为 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() 函数。

关于linux - gettimeofday() 是否保证为微秒级分辨率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/88/

相关文章:

php - 错误: "500 internal server error" in virtualhost ubuntu 16. 04

java - 使用 Java : How to display on-screen keyboard in linux or mac

linux - 另一个 Bash 权限被拒绝的帖子

c++ - 什么是 Vb.net 等同于 C++ 中的 1.0e-5?

visual-studio-2008 - "Copy to output directory"在 VC++

linux - Docker - 如何检查 Dockerfile 中的 curl 命令是否有响应代码 200

c++ - 子对话框 - SetWindowTextA 或 SendMessageA 使程序崩溃 - MFC

c - Windows 创建动态数量的链接

c++ - Winsock 速率限制

使用结构时出现编译器错误 C2143