正在寻找高分辨率计时器
Looking for a high resolution 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);
}
使用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
相关文章:
- Linux的Cpp上的计时器
- 提升 ASIO 无法识别计时器对象
- 在Windows(C++)中使用USB相机拍摄高分辨率照片
- 提升 asio 并发计时器取消问题与链
- 使用单体计时器的pthread_cond_timedwait有时会比预期晚超时
- 如何在C++中为高分辨率时钟声明变量?
- 窗口中的微秒计时器
- 在没有NtSetTimerResolution的Windows上提高计时器分辨率(高分辨率)
- 实现高分辨率计时器的最佳方法
- C++Windows中的高分辨率定时器库
- 如何获取当前的 Windows 系统范围的计时器分辨率
- 与 sleep() 相比,计时器的精度是否更高?
- 高精度事件计时器
- C++中的高分辨率定时器
- 高分辨率计时器与低分辨率计时器
- 为什么我应该使用SetTimer功能,而不是多媒体定时器服务的应用程序不需要高分辨率定时
- Windows(也包括OS X、Linux)上Qt中的高分辨率定期计时器
- 在Windows上更改Qt的计时器分辨率
- 正在寻找高分辨率计时器
- 如何获得比Windows XP上的计时器滴答(15毫秒)更高精度的时间