【问题标题】:Is boost::posix_time::microsec_clock CPU intensive?boost::posix_time::microsec_clock CPU 密集吗?
【发布时间】:2012-12-25 03:54:36
【问题描述】:

我想使用 Boost 获得毫秒精度的时间。 (精度不需要毫秒级,接近即可。)

参考Local time with milliseconds等,表示应该使用微秒时钟:

boost::posix_time::microsec_clock::local_time();

根据我的经验,使用标准、低影响的系统调用(即 Windows 上的 ::GetTicks())是不可能获得精确到微秒的时间(假设有类似的精度)。相反,需要发出 CPU 密集型调用以将精度提高到毫秒级(微秒级)以上。

正如我所提到的,我不需要微秒级的精度 - 只是稍微接近毫秒级的精度。但是,Boost.Date_Time 没有提供任何“millisec_clock”——它提供了一个second_clock,下一个渐变是microsec_clock,中间没有“millisec_clock”。

如果我使用microsec_clock(如前所述)来获得 MILLIseconds,我会受到 CPU 密集型调用的影响吗?

【问题讨论】:

    标签: c++ boost


    【解决方案1】:

    我使用 boost::date_time 对象做了一个辅助对象,用于测量函数内花费的时间,特别是我使用了 microsec_clock::local_time()。

    我正在使用这个对象来测量对不同函数的几百万次快速调用(一个压力测试用例),突然间我开始注意到我无法解释我的流程的很多执行时间。经过一些实验,我删除了大部分这些计数器,我的代码的总执行时间从 ~23 分钟到约 12 分钟(约 50% !!)

    所以,根据我的经验回答你的问题,microsec_clock::local_time() 很贵。

    看到这个后,我使用 microsec_clock::universal_time() 而不是 microsec_clock::local_time() 进行了测试,这绝对是我运行时间的改进。它仍然增加了大约 3 分钟,但比 10 分钟要好:P。考虑一下,我想问题是 local_time() 偏移了时间值以考虑时区,在我的情况下不需要(因为我只需要时间差异)。我还得做个测试,看看其他方法是不是更快(比如clock_gettime)。

    我希望这是您正在寻找的答案类型。

    【讨论】:

      【解决方案2】:

      根据Relevant documentation

      在大多数 Win32 平台上,它是使用 ftime 实现的。 Win32 系统通常无法通过此 API 实现微秒级分辨率。如果更高的分辨率对您的应用程序至关重要,请测试您的平台以查看达到的分辨率。

      ftime 似乎不是一个过于繁重的功能(here is a question about how it works),但我想这取决于你对 CPU 密集型的想法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-09
        • 1970-01-01
        • 1970-01-01
        • 2012-04-09
        • 2016-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多