正在寻找高分辨率计时器

Looking for a high resolution timer

本文关键字:计时器 高分辨率 寻找      更新时间:2023-10-16

在C++for Linux中,我尝试每微秒/纳秒做一些事情,目前正在使用下面的nanosleep函数。它是有效的,但是如果代码循环数百万次,这将变得昂贵。我正在寻找一个高分辨率的定时器,将允许一个非常精确的时间(应用程序是音频/视频(。有什么想法吗?

struct timespec req = {0};
req.tv_sec = 0;
req.tv_nsec = 1000000000L / value;
for(long i = 0; i < done; i++)
{
    printf("Hello world");            
    nanosleep(&req, (struct timespec *)NULL);
}

使用C++11

#include <chrono>
#include <thread>
...
for (long i = 0; i < done; i++) {
    std::cout << "Hello world" << std::endl;            
    std::this_thread::sleep_for(std::chrono::nanoseconds(1e9 / value));
}

请记住使用-std=c++11标志进行编译。

对于音频/视频,通常不需要纳米/微秒精度的计时器,毫秒就足够了。音频中最常见的数据包间间隔是20ms。为此目的使用纳米睡眠是可以的。

此外,除非您使用实时操作系统,否则您无法保证从内核获得如此好的时序。

在实时通信中使用睡眠的缺点是:它们没有保持适当的频率(50赫兹用于20毫秒间隔的音频(。因为在每一次勾选中,您都会将处理时间添加到睡眠间隔中。所以睡眠时间间隔必须根据上一个刻度时间戳和下一个预期的刻度时间戳来计算。

您可以使用睡眠来实现短间隔计时器(例如10ms(,并处理在计时器警报上该计时器警报之间发生的事件。如果您这样做,您将优化操作系统资源的使用(最大限度地减少进程/线程上下文切换(。

您可以使用getitimer(2(获得微秒分辨率:

http://man7.org/linux/man-pages/man2/setitimer.2.html