我试着获得一个分辨率为几百纳秒的时间信息(在Raspberry Pi上做一些比特晃动的事情)。我尝试使用clock_gettime(),它在timespec.tv_nsec中提供了所需的分辨率,但它太慢了。即使我独自在CPU的一个独立核心上运行我的进程,即使我将此进程设置为最高优先级,整个时间测量循环也需要大约450纳秒,其中函数clock_gettime()使用大约360纳秒。
所以我的问题是:有没有办法更快地检索当前时间?还有其他时间功能吗?或者它是使用内核模块而不是用户空间进程的解决方案吗?
答案 0 :(得分:1)
可能不是。 clock_gettime()
已经通过vDSO实现,因此它可能是最快的系统调用。
但请考虑所涉及的时间尺度。使用2 GHz处理器,450纳秒只有900个时钟周期。那不是很多。
在一台1,86 GHz Core 2机器上,在循环中仅运行clock_gettime()
会返回相隔86 ns的值。只需添加for (int j = 0 ; j < 100 ; j++);
的填充,即可增加到540 ns。 (每次循环迭代大约4.5 ns,或大约8-9个时钟周期)
那时候你能做的并不多。你能做的是计算时钟周期或循环迭代。事先使用clock_gettime()
来确定 N 迭代的繁忙循环在该机器上需要多长时间,然后缩放迭代次数以获得所需长度的定时循环。
在进行实际的位翻转时,您可能仍需要一些时间,假设它通过系统调用。内核模块在那里可能很有用,因为您可以避免系统调用开销。在内核中,在处理bit-banging时可能更容易防止代码被抢占。