|
| 1 | +# R14.16 runtime/VM 热点优化报告 |
| 2 | + |
| 3 | +## 范围与基线 |
| 4 | + |
| 5 | +- 在 R14.15 的递归函数查找优化后,继续使用 `port/linux/performance` 的 10 轮预编译 `fib(20)` 作为 runtime workload。 |
| 6 | +- Docker `pikadev`、Release `-O3 -g`、`PIKA_CONFIG_ENABLE=ON`、`PIKA_OPTIMIZE_SPEED`,临时移除 performance target 的 `-pg` 后用 Callgrind 采样;parser 不在执行循环内。 |
| 7 | +- 基线为 `3,016,729,750` 条指令。主要 self 热点包括 VM 主循环 8.63%、`hash_time33` 4.94%、`VM_instruction_handler_OPT` 3.58%、`_obj_getObjWithKeepDeepth` 3.43%、参数加载 3.04%,另有 malloc/free 和栈复制成本。 |
| 8 | + |
| 9 | +## 根因与实现 |
| 10 | + |
| 11 | +- R6.2 已在 `_obj_getObjWithKeepDeepth(..., keepDeepth=1)` 的路径长度断言后增加无点号快速返回,但无限定函数名仍先创建路径栈缓冲并执行完整 `strlen`。 |
| 12 | +- 将无点号 host 快路径提前到缓冲区和长度检查之前。只有包含点号、确实需要路径复制和分词时才检查 `PIKA_PATH_BUFF_SIZE`;对象查找顺序、嵌套路径和临时对象语义不变。 |
| 13 | +- VM 成功路径只在 frame error 非零时压入 thread error stack;只有 frame 已报错或 thread error stack 非空时进入完整 stack error 检查,避免无错误时重复检查 frame code。 |
| 14 | +- 将无头文件声明且仅在 `PikaObj.c` 内使用的 `_obj_getMethodArgWithFullPath` 设为 `static`,用于补偿代码体积并释放编译器优化空间;未采用把 `_obj_getMethodArg` 一并内部化的方案,因为其动态指令略高。 |
| 15 | + |
| 16 | +## A/B 与资源 |
| 17 | + |
| 18 | +- 最终 Callgrind:`3,016,729,750 -> 2,956,509,801`,减少 `60,219,949` 条指令,改善 1.996%。 |
| 19 | +- 单独的 error fast path 仅减少 437,824 条指令(0.0145%);主要收益来自避免无限定 host 路径的无效长度扫描。 |
| 20 | +- performance 可执行文件:text `1,465,403 -> 1,465,212`,减少 191 B;data 保持 70,980 B;bss 保持 24,408 B。 |
| 21 | +- 分配次数保持 1,106,806,缓存命中保持 9,662;未增加常驻 RAM、对象字段、缓存或动态分配。 |
| 22 | + |
| 23 | +## 正确性 |
| 24 | + |
| 25 | +- 新增 `pikaMain.recursive_call_error_propagation`,验证递归内部未定义名称仍输出 `NameError`、不生成 `result`,并在释放后保持 `pikaMemNow() == 0`。 |
| 26 | +- 定向 GTest:递归正常调用、递归错误传播、单段/嵌套 host 对象路径共 3/3 通过。 |
| 27 | +- 定向 Valgrind:11,688 allocs / 11,688 frees,退出 0 bytes,0 leaks,0 errors。 |
| 28 | +- Docker 默认配置(`PIKA_CONFIG_ENABLE=ON`、4096 B VM stack)隔离网络及既定不稳定 REPL 项后,454/454 通过。 |
| 29 | +- 曾误复用 `PIKA_CONFIG_ENABLE=OFF` 的 512 B stack 构建,测试在请求 528 B 时进入既有 overflow handler;改用全新默认配置构建后全量通过,该错误口径未计入结论。 |
| 30 | + |
| 31 | +## 在线基准 |
| 32 | + |
| 33 | +R14.15 的 Action/Pages 已成功发布,`gh run benchmark` 按提交 `8a3be5414` 抓到 13 项测量,其中新增 `fibonacci_recursive_20` 为 `74.463991 ms/iter`。该项目此前没有 Pages 历史点,因此不声明线上跨提交改善比例;本轮归因使用同二进制 Callgrind A/B。 |
0 commit comments