具有毫秒精度的 Linux/OSX 时钟分辨率?

Posted

技术标签:

【中文标题】具有毫秒精度的 Linux/OSX 时钟分辨率?【英文标题】:Linux/OSX Clock Resolution with millisecond accuracy? 【发布时间】:2012-07-07 20:37:05 【问题描述】:

在 Windows 上,我可以调用 QueryPerformanceCounter 来获取高分辨率数据点,但此方法调用会受到 Bios、多核 CPU 和某些 AMD 芯片问题的影响。我可以调用 timeBeginPeriod 将 Windows 中的系统时钟分辨率提高到 1 毫秒(而不是标准的 ~15 毫秒),这意味着我可以只使用调用 timeGetTime 并以我指定的时钟分辨率获取时间。

所以!在 OSX/Linux 上,我应该期待什么样的 C++ 时钟分辨率?我可以获得类似于 Windows 的 1ms 分辨率吗?由于我正在做实时媒体,我希望这个时钟分辨率尽可能低:我可以在内核中更改这个值(比如在 Windows 中使用 timeBeginPeriod)吗?这是一个高性能的应用程序,所以我想让当前时间成为一个快速的函数调用。而且我想知道时钟是否通常会漂移或我会遇到什么奇怪的问题。

谢谢! 布雷特

【问题讨论】:

【参考方案1】:

如果您使用的是 C++11,您可以使用std::chrono::high_resolution_clock,它应该为您提供系统提供的高分辨率时钟。要获得毫秒的持续时间,您会这样做

typedef std::chrono::high_resolution_clock my_clock;

my_clock::time_point start = my_clock::now();

// Do stuff

my_clock::time_point end = my_clock::now();

std::chrono::milliseconds ms_duration = 
    std::chrono::duration_cast<std::chrono::milliseconds>(end - start);

如果您不使用 C++11,那么 gettimeofday 函数可以在 OSX 和大多数 linux 发行版中使用。它以秒和微秒为单位为您提供自纪元以来的时间。分辨率未指定,但在任何现代系统上,它都应该能提供至少毫秒级的精度。

【讨论】:

【参考方案2】:

补充大卫的回答,如果你不能使用 C++11,Boost 的 Timer 类可以帮助你。

【讨论】:

您好,我也有类似的需求。在 Windows 中,我在我的高性能应用程序中使用 timeBeginPeriod 和 timeEndPeriod。现在,可以在 Linux 中使用上述两个 Windows API 给出的 1 毫秒时钟分辨率。上述使用 chrono:: high_resolution_clock 的解决方案是否可以正常工作?或者现在是否有任何新的解决方案或解决方法可以在 Linux 中实现这一点。

以上是关于具有毫秒精度的 Linux/OSX 时钟分辨率?的主要内容,如果未能解决你的问题,请参考以下文章

毫秒分辨率计时器是LinkIT 7688

关于雷达分辨力

谷歌应用引擎 GQL,如何以毫秒精度使用日期时间进行分页

具有毫秒精度的时间戳:如何将它们保存在 MySQL 中

评论中科大实现皮秒精度任意时间序列发生器先进性

ds3231高精度时钟模块怎么用