寻找一个高分辨率的计时器

在C ++ for Linux中,我正在尝试每秒微秒/纳秒的操作,目前正在使用下面的nanosleep函数。 它的工作,但是如果代码循环数百万次,这变得昂贵。 我正在寻找一个高分辨率的计时器,将允许一个非常精确的时间(应用程序是audio/video)。 有任何想法吗?

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。 为此目的使用nanosleep是okey。

而且,除非使用实时操作系统,否则不能保证从内核获得如此好的时序。

在实时通信中使用睡眠的缺点是:它们不保持适当的频率(对于20ms间隔的音频为50Hz)。 因为在每次打勾时您都会将处理时间添加到睡眠间隔。 所以睡眠时间间隔必须根据之前的时间戳记和下一个预期的时间戳记时间戳来计算。

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

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

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