SuperAPI AI 工具集

codspeed-profiling

通用与其它

查看项目

更新于 10-15 23:41

技能介绍

用途:在本地使用与 CodSpeed CI 相同的 valgrind-codspeed 分支进行性能剖析,使指令计数与 CI 报告一致,主要用于诊断基准回归。

前提条件:已安装 valgrind-codspeed 分支(可用 valgrind --version 检查是否显示 codspeed);项目具备 just profile <bench> [filter] 配方或等价的 callgrind 工作流。

诊断回归的步骤:

  1. 剖析回归:运行 just profile <bench_name> <filter>,生成 profiles/<label>.callgrind(原始数据)、.callgrind.flat.txt(按函数自身开销的扁平注解)、.callgrind.tree.txt(调用树含开销注解)三个文件。
  2. 剖析基线:先保存回归剖析结果,再 git stash && git checkout main 后运行 just profile,保存 main 结果,最后 git checkout <branch> && git stash pop 回到分支。
  3. 比较指令数:用 rg 过滤热点函数并对比 main 与分支的 flat 文件,重点关注 Ir 列(第一个数字,即指令计数,也是 CodSpeed 计费依据)。
  4. 源码级注解:运行 callgrind_annotate --auto=yes profiles/<label>.callgrind 2>/dev/null | rg -A 5 -B 5 'function_name',查看每行指令计数。

输出解读:flat 注解列为 Ir Dr Dw I1mr D1mr D1mw ILmr DLmr DLmw。Ir 为执行指令数,是主要成本指标;Dr/Dw 为数据读写,反映内存压力;I1mr 为 L1 指令缓存未命中,反映代码局部性;D1mr 为 L1 数据缓存读未命中,反映数据局部性。内联函数会以调用者符号名出现但使用被调用者的源文件,例如 throttle.rs:kbd::dispatcher::Dispatcher::process_internal 表示 check_throttle 被内联进 process_internal。

常见模式:冷路径上的不必要工作(函数每次事件都运行但仅对子集有用,可在昂贵初始化前加提前返回守卫);枚举体积膨胀(大枚举按值传递经 match-and-return 链产生额外移动指令);隐藏的 Instant::now() 调用(callgrind 下时钟读取开销较大,应置于状态检查之后按需执行)。

修复后:务必重新剖析验证,运行 just profile <bench_name> <filter> 并用 rg 过滤,比较 main、回归、修复三者的 Ir 计数,完成后清理临时剖析文件。

限制:资料未提供该技能的具体安装方式、支持平台、收费信息及更多使用限制。