使用纳秒分辨率获取当前时间的快速方法?

Fast method to get current time with nsec-resolution?

我尝试获取分辨率为几百纳秒的时间信息(在 Raspberry Pi 上做一些位爆炸的事情)。我尝试使用 clock_gettime() 在 timespec.tv_nsec 中提供所需的分辨率,但它太慢了。即使我 运行 我的进程完全在 CPU 的一个单独核心上,即使我将此进程设置为最高优先级,整个时间测量循环也需要大约 450 纳秒,其中大约 360 纳秒被函数 clock_gettime().

所以我的问题是:有没有办法更快地检索当前时间?还有其他时间功能吗?或者使用内核模块而不是用户 space 进程是一种解决方案吗?

可能不会。 clock_gettime() 已通过 vDSO 实现,因此它可能是最快的系统调用。

但请考虑所涉及的时间尺度。对于 2 GHz 处理器,450 纳秒仅为 900 个时钟周期。那不是很多。

在一台 1.86 GHz Core 2 机器上,运行 只是 clock_gettime() 在一个循环中 returns 值相隔 86 ns。只需添加 for (int j = 0 ; j < 100 ; j++); 的填充符即可将其增加到 540 ns。 (每次循环迭代大约 4.5 ns,或大约 8-9 个时钟周期)

那段时间你无能为力。您可以做的是计算时钟周期或循环迭代。预先使用 clock_gettime() 确定 N 迭代的繁忙循环在该机器上需要多少时间,然后缩放迭代次数以获得所需长度的定时循环。

假设它通过系统调用进行实际的位翻转,您可能仍需要一些时间。内核模块在那里可能很有用,因为您可以避免系统调用开销。在内核内部,防止代码在进行 bit-banging 时被抢占也可能更容易。