【问题标题】:Fast method to get current time with nsec-resolution?使用 nsec 分辨率获取当前时间的快速方法?
【发布时间】:2018-10-30 04:31:06
【问题描述】:

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

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

【问题讨论】:

标签: linux linux-kernel raspberry-pi kernel-module


【解决方案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 次迭代的busyloop 需要多少时间,然后缩放迭代次数以获得所需长度的定时循环。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-15
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多