You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux内核模块中如何正确测量函数的执行时间?

测量逻辑正确性说明

你用ktime_get_ns()计算的差值单位确实是纳秒,测量逻辑本身没有原则性错误,但代码存在几处不规范和潜在问题:

代码存在的问题

  • 变量类型匹配不规范
    ktime_get_ns()的返回值为s64类型的纳秒时间戳,你将start_time、stop_time定义为ktime_t类型虽然在多数内核版本可以正常运行,但更规范的写法有两种:
    1. 全用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;
    
    1. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 00:48:03