【问题标题】:What's the equivalent of Windows' QueryPerformanceCounter on OSX?在 OSX 上相当于 Windows 的 QueryPerformanceCounter 是什么?
【发布时间】:2010-10-02 15:39:20
【问题描述】:

我正在将一个库从 Windows 移植到 *NIX(目前是 OSX),现在有人可以使用什么函数来代替 Microsoft 的 QueryPerformanceCounter 和 QueryPerformanceFrequency 吗?

【问题讨论】:

    标签: c++ c windows unix porting


    【解决方案1】:

    http://www.tin.org/bin/man.cgi?section=3&topic=clock_gettime (以及那里提到的其他功能) - 这是Posix!如果 HPET 不存在,将退回到更差的计数器。 (不过应该不是问题)

    http://en.wikipedia.org/wiki/High_Precision_Event_Timer

    分辨率应约为 +10Mhz。

    【讨论】:

    • clock_gettime 是 POSIX 实时扩展的一部分,遗憾的是没有在 Mac OS X 上实现。
    • 不是一个很好的答案。不支持clock_gettime,它以秒为单位返回时间,而不是计数器滴答(即使支持)。
    【解决方案2】:

    过去,您要么拥有 uclock,要么深入研究汇编程序以阅读 RDTSC

    G.

    【讨论】:

    • 如果您使用的是高分辨率计时器,您可能不会进入省电模式。
    • 您可能不是,但某些其他进程可能会将系统置于该模式。这取决于您的系统有什么样的约束。对于公众来说,它不能保证。
    • 如果你的进程切换cpus也会搞砸,如果我没记错的话……我们已经使用tsc + linux和省电功能的效果做了一些评估。每个核心都有自己的 tsc。
    • 最近的 AMD 和 Intel 芯片实现了一致的 RDTSC。对我来说已经足够了。
    【解决方案3】:

    尝试使用 boost 的 ptime 以获得便携式高分辨率计时。

    更新(提示,2 年后,由 Mark 在下面的评论):

    这些天我会使用 std::chrono::high_resolution_clockexample.

    【讨论】:

    • 看起来这将在 linux/mac 上工作,但引用:使用亚秒级分辨率时钟获取 UTC 时间。在 Unix 系统上,这是使用 GetTimeOfDay 实现的。在大多数 Win32 平台上,它是使用 ftime 实现的。 Win32 系统通常无法通过此 API 实现微秒级分辨率。如果更高的分辨率对您的应用程序至关重要,请测试您的平台以查看达到的分辨率。
    • 谢谢,ptime 不像我想象的那么便携。尽管如此,你还是提示我在这里更新我的答案。另见stackoverflow.com/questions/1487695/…
    【解决方案4】:

    他询问了 OS X。使用 CoreAudio 的这些 API:

    AudioConvertHostTimeToNanos(AudioGetCurrentHostTime())
    

    【讨论】:

      【解决方案5】:

      在 OSX 上,mach_absolute_timemach_timebase_info 是 Win32 QueryPerformance* 函数的最佳等效项。

      http://developer.apple.com/library/mac/#qa/qa1398/_index.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        • 2018-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多