我正在为一个特殊的相机编写一个内核模块,通过 V4L2 处理帧到用户空间代码的传输。然后我在应用程序中做很多用户空间的事情。
时间在这里非常关键,所以我一直在做大量的性能分析和普通的旧 std::chrono::steady_clock
东西来跟踪时间,但我已经到了我的地步还需要从内核端收集计时数据,以便我可以分析从硬件中断到 V4L DQBuf 到用户空间的整个路径...
谁能推荐一种获取高分辨率计时数据的好方法,它与应用程序用户空间数据一致,我可以将其用于此类比较?现在我正在以微秒为单位测量事件..
Ubuntu 12.04 LTS
最佳答案
在最低级别,如果您使用的是 x86/x86-64 处理器,则有 rdtsc
和 rdtscp
指令。这应该在内核/用户空间边界上提供最低的开销、尽可能高的分辨率。
但是,有些事情您需要担心。您需要确保您在同一个核心/cpu 上执行,进程没有进行上下文切换,并且频率在调用之间没有变化。如果 cpu 支持不变的 tsc,(/proc/cpuinfo
中的constant_tsc
)它在 cpus/核心和频率上更可靠一些。
这应该提供大约纳秒级的精度。
关于c++ - 跨内核和用户空间的 Linux 时序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22646933/