Linux内核模块中如何正确测量函数的执行时间?
测量逻辑正确性说明
你用ktime_get_ns()计算的差值单位确实是纳秒,测量逻辑本身没有原则性错误,但代码存在几处不规范和潜在问题:
代码存在的问题
- 变量类型匹配不规范
ktime_get_ns()的返回值为s64类型的纳秒时间戳,你将start_time、stop_time定义为ktime_t类型虽然在多数内核版本可以正常运行,但更规范的写法有两种:- 全用
s64类型,直接相减得到纳秒差值:
#include <linux/ktime.h> s64 start_time, stop_time, elapsed_time; start_time = ktime_get_ns(); // 待测量逻辑 stop_time = ktime_get_ns(); elapsed_time = stop_time - start_time;- 用
ktime_get()获取ktime_t类型时间,再用内核提供的辅助函数转换:
#include <linux/ktime.h> ktime_t start_time, stop_time; s64 elapsed_time; start_time = ktime_get(); // 待测量逻辑 stop_time = ktime_get(); elapsed_time = ktime_to_ns(ktime_sub(stop_time, start_time)); - 全用
- 打印格式存在溢出风险
你将s64类型的耗时强转为unsigned int后用%u打印,当耗时超过约4.29毫秒(2^32纳秒)时就会出现溢出,输出错误结果。正确的打印写法为:
pr_info("elapsedTime : %lld ns\n", (long long)elapsed_time);
测量准确性优化建议
- 你当前得到的6ns结果如果是测量空
for_each_process()循环的结果,在系统进程数量较少的场景下属于合理值。 - 单次测量结果容易被中断、调度等系统因素干扰,建议对同一逻辑多次测量取平均值,排除偶然误差。
- 如果需要测量执行时间极短的函数,可在测量前后临时关闭本地中断和内核抢占,进一步降低干扰,但该操作会影响系统实时性,仅可用于调试场景,不能在生产环境长时间开启。
内容的提问来源于stack exchange,提问作者Anh Hoang
相关产品推荐
相关产品推荐

