寻找高分辨率计时器

时间:2015-07-10 04:48:05

标签: c++ linux timer

在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);
}

3 个答案:

答案 0 :(得分:4)

使用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标志进行编译。

答案 1 :(得分:1)

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

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

在实时通信中使用睡眠的缺陷是:它们没有保持适当的频率(音频为50Hz,间隔为20ms)。因为在每个刻度线上您都会为睡眠间隔添加处理时间。因此,必须根据先前的滴答时间戳和下一个预期的滴答时间戳计算睡眠间隔。

您可以实现短时间间隔计时器(例如10毫秒),以及在定时器警报上此计时器警报之间应发生的休眠和处理事件。如果这样做,您将优化OS资源使用(最小化进程/线程上下文切换)。

答案 2 :(得分:0)

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

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