XIV DB 全历程性能对照(2026-11-02)
从会话 ses_e6e10ecd1ffeE5t54LpIQAm326 的优化开始,使用同一份完整生产 XIV DB 输入重新测量后续优化、资源/模块重构、comemo、HEAD 和未提交工作区。不拼接旧报告的秒数。
本轮完成:18 个对照点、90 次普通 CLI、51 次阶段 profile、9 次进程/27 轮 comemo 同进程组装;另测 8 个默认额度失败。原有已跟踪文件的工作区 diff 与测量前逐字节相同,本轮只新增 profile 工具与报告,未改消费者或生产默认值。
结论
Tera 迁移基线 6.261 s → 当前工作区 3.548 s,减少 43.3%,速度 1.76×。
峰值 RSS 2417.7 → 812.1 MiB,减少 66.4%。
存档 Handlebars 补充参照为 6.774 s / 2562.1 MiB;完整未提交源码未恢复,不与可重建的 Tera 主线混淆。
全量为 51,225 详情 + 513 目录 + 首页,共 51,739 HTML、51,744 文件。没有删物品或改为客户端生成正文。
收益与退化
最大的单步耗时收益来自去除整站 JSON 中间树(−0.791 s)、Python 批量编码(−0.542 s)及共享语义定义(−0.471 s)。Renderer 直接构造与共享 HTML targets 两步合计减少约 0.586 s。
共享语义定义同时将 RSS 从 1421.0 降至 770.5 MiB,减少约 650.6 MiB;共享页面/目录值另减少约 478.3 MiB。
环境句柄优化版为 3.185 s;资源/共享值/Data 重构后为 3.582 s,增加 0.397 s(12.5%)及约 45.1 MiB RSS。对应 profile 的分析+求值管线从 687 增至 1014 ms(+327 ms),prepare 与模板阶段基本不变;其中 analyze 约 +199 ms、evaluate 约 +100 ms,包含式子阶段不可再次累加。这里定位到阶段,不把整项差异归因于某一个资源检查函数。
当前 3.548 s 仍比环境句柄优化版慢约 11.4%。资源重构以后的模块分层、comemo、移除 Markdown helper 及未提交语言能力,profile 主要阶段接近;小幅中位数差异和 CLI listen 控制点的浮动不作独立优化或回退结论。
当前主要成本是分析/求值约 1.008 s、发布约 0.829 s、prepare 约 0.767 s。纯 Tera render 仅约 0.271 s(逐页模板管线合计约 0.439 s),正文 HTML renderer 约 0.040 s,已不是主要瓶颈。发布中写文件约 0.405 s,安全检查/交换/旧目录清理等余项约 0.424 s。
1. 同批普通 CLI 对照
每个点预热并验证;各 5 次新进程,轮转并正反序交错,CPU 8。表中为中位数及实测范围。off/compile 是同一 comemo 提交的消融,不是新的历史提交。
对照点 | 引擎 | 脚本 | wall s(范围) | RSS MiB | user + sys s |
|---|---|---|---|---|---|
handlebars · 存档 Handlebars 优化基线 | 存档 | a76ae04 | 6.7736 (6.6248–6.8100) | 2562.1 | 5.449 + 1.224 |
tera · Tera 2 | debe71b | a76ae04 | 6.2613 (6.1618–7.3724) | 2417.7 | 5.032 + 1.199 |
renderer · 直接 Renderer | a03620f | a76ae04 | 5.9680 (5.8354–6.0875) | 2417.7 | 4.713 + 1.169 |
html-shared · 共享 HTML targets | 1111fe7 | a76ae04 | 5.6757 (5.5973–5.7457) | 2417.8 | 4.383 + 1.241 |
borrowed · 去中间 JSON | d7d652b | a76ae04 | 4.8851 (4.8723–5.0147) | 1991.8 | 3.728 + 1.120 |
context · 共享 Tera 值 | 86451bd | a76ae04 | 4.6484 (4.5922–4.7204) | 1513.5 | 3.562 + 1.047 |
json-batch · Python 批量紧凑编码 | 86451bd | f4fc8d5 | 4.1069 (4.0605–4.2682) | 1513.5 | 3.002 + 1.059 |
catalog · 目录四字段摘要 | 86451bd | 1832d47 | 3.9343 (3.9050–3.9952) | 1421.0 | 2.851 + 1.026 |
semantic · 共享语义定义 | 8401ea8 | 1832d47 | 3.4636 (3.4468–3.4891) | 770.5 | 2.490 + 0.943 |
environment · 复用环境句柄 | 0d81985 | 1832d47 | 3.1854 (3.1207–3.8947) | 770.5 | 2.205 + 0.928 |
resources · 资源/共享值/Data | ef38d1b | 1832d47 | 3.5821 (3.4359–3.6154) | 815.6 | 2.495 + 1.026 |
modules · 模块分层 | 268fb35 | 1832d47 | 3.6445 (3.5837–4.1604) | 811.6 | 2.477 + 1.082 |
listen · CLI listen 控制 | 79d4734 | 1832d47 | 3.5358 (3.4953–3.6345) | 812.0 | 2.459 + 1.059 |
memo-off · comemo ablation:off | daed34c | 1832d47 | 3.5181 (3.5059–3.5383) | 812.2 | 2.429 + 1.061 |
memo-compile · comemo ablation:compile | daed34c | 1832d47 | 3.5277 (3.4831–4.2435) | 812.2 | 2.466 + 1.040 |
memo-both · comemo:both | daed34c | 1832d47 | 3.5547 (3.4542–3.6372) | 811.8 | 2.466 + 1.029 |
head · HEAD:移除模板 Markdown helper | 2468767 | 1832d47 | 3.5612 (3.5366–4.1341) | 811.9 | 2.457 + 1.060 |
working · 工作区:str/len/for | 2468767 | 1832d47 | 3.5479 (3.4960–3.6144) | 812.1 | 2.468 + 1.036 |
2. 阶段归因
另外构建了插桩二进制,每点三轮。下表为包含式 ms 中位数,不替代上表无插桩 CLI。父阶段包含其详细子阶段,不可再与子阶段相加;不同列的中位数也不保证严格可加。
对照点 | prepare | 分析+求值管线 | 正文管线 | 共享模板上下文 | 逐页模板管线 | SSG 局部释放残差 | 发布写盘+旧目录清理 |
|---|---|---|---|---|---|---|---|
tera | 1374.40 | 1065.41 | 906.11 | 816.13 | 574.15 | 340.49 | 961.31 |
renderer | 1369.03 | 1074.14 | 576.07 | 816.25 | 576.70 | 338.11 | 941.60 |
html-shared | 1370.07 | 1058.42 | 259.07 | 800.42 | 578.79 | 339.87 | 1000.37 |
borrowed | 1377.18 | 1067.43 | 260.23 | 267.91 | 552.10 | 224.13 | 978.70 |
context | 1385.62 | 1122.36 | 264.88 | 237.36 | 461.74 | 118.79 | 942.07 |
json-batch | 828.60 | 1072.39 | 266.16 | 236.80 | 468.16 | 131.18 | 954.17 |
catalog | 753.44 | 1088.11 | 264.72 | 175.53 | 438.93 | 101.87 | 969.66 |
semantic | 756.40 | 866.49 | 268.55 | 184.66 | 449.65 | 100.42 | 815.56 |
environment | 757.94 | 687.19 | 159.30 | 181.61 | 441.34 | 97.43 | 848.67 |
resources | 748.83 | 1013.86 | 152.85 | 183.61 | 435.58 | 97.36 | 810.07 |
modules | 751.50 | 1018.51 | 158.46 | 179.85 | 443.72 | 99.19 | 828.19 |
listen | 756.64 | 1012.03 | 156.95 | 180.52 | 433.25 | 98.91 | 851.54 |
memo-off | 745.77 | 1013.35 | 154.04 | 179.94 | 442.30 | 98.83 | 849.14 |
memo-compile | 752.29 | 1016.06 | 156.91 | 177.98 | 439.71 | 99.38 | 814.20 |
memo-both | 745.49 | 1011.18 | 156.18 | 177.83 | 435.06 | 97.63 | 861.94 |
head | 753.02 | 1004.56 | 153.48 | 183.54 | 441.09 | 98.31 | 852.53 |
working | 766.87 | 1007.97 | 155.45 | 175.97 | 438.73 | 100.51 | 829.01 |
当前版本详细阶段
阶段(包含式) | 调用次数 | ms |
|---|---|---|
cli.total | 1 | 3549.995 |
cli.assemble | 1 | 2678.894 |
ssg.total | 1 | 2649.764 |
ssg.prepare | 1 | 766.874 |
stdio.process | 1 | 519.445 |
stdio.decode | 1 | 124.868 |
ssg.pipeline | 1 | 1007.974 |
pipeline.analyze | 51739 | 659.121 |
vault.document_lower | 51739 | 271.307 |
vault.ensure_environment | 51739 | 292.301 |
vault.document_analysis | 51739 | 38.536 |
pipeline.evaluate | 51739 | 227.833 |
ssg.bodies | 1 | 155.454 |
body.registry | 51739 | 61.028 |
body.html | 51739 | 39.563 |
body.components | 51739 | 1.099 |
ssg.shared_context | 1 | 175.975 |
ssg.page_templates | 1 | 438.728 |
template.context | 51739 | 35.788 |
template.render | 51739 | 270.718 |
template.output | 51739 | 126.735 |
cli.publish | 1 | 829.008 |
publish.write | 1 | 404.583 |
ssg.local_release(残差) | — | 100.510 |
cli.prepare_vault_release(残差) | — | 29.130 |
publish.other_cleanup(残差) | — | 424.425 |
SSG 局部释放残差是 SSG 总时间减去显式子阶段,含大上下文、文档、目录等局部对象释放及少量未分配的尾部工作;宿主残差同时含宿主准备、观察结果收集与 Vault 释放;发布余项同时含安全检查、目录交换和旧输出清理,不是独立 allocator profile。
3. comemo:同进程完整站点组装
同一个带 profiling feature 的二进制切换三种模式。每种模式三次进程,每次三轮新建 Vault;首轮计算缓存为空,后两轮保留进程级缓存。组装计时不含最后一次输出验证副本写盘。此 example 使用 FsResources 直接读取整份 Notist.toml,而普通 CLI 使用内存合成的 target 配置,两者的绝对组装时间不可互相相减;这里仅比较 example 内部的三种模式。
模式 | 首轮 ms(中位数/范围) | 后两轮 ms(中位数/范围) | 首轮 compile_work / bind_work 次数 | 后续 compile_work / bind_work 次数 |
|---|---|---|---|---|
baseline | 3062.42 (3061.56–3082.06) | 3028.73 (3011.32–3036.76) | 0 / 51739 | 0 / 51739 |
compile | 3067.97 (3059.24–3074.51) | 3019.08 (2999.81–3032.90) | 0 / 51739 | 0 / 51739 |
both | 3049.71 (3043.69–3067.16) | 3021.83 (3011.22–3059.94) | 0 / 0 | 0 / 0 |
XIV DB 生产模板站点没有 notc 导入,compile 实际执行为零。开启绑定缓存还包含空 BindingSpec 的共享空作用域 fast path;零 bind_work 不能表述为大量模块导入的缓存命中。三种模式的组装时间范围重叠,本轮未测得稳定的整站收益。普通 CLI 每次为新进程,不能用同进程热缓存解释其耗时差异。
4. 产物与默认额度
18 个点都通过消费者校验器:完整物品集合、513 页目录分页、全部本地 HTML 链接;详情不依赖 JavaScript。
所有 Tera 及以后对照点的完整路径集合和逐文件 SHA-256 相同。探针版第一轮也逐文件与对应普通版本比较;同进程组装的最终完整输出副本也与普通版本逐文件一致。
Handlebars/Tera 的全部 HTML 解析事件相同(只归一化缩进空白、属性顺序和字符实体),非 HTML 文件字节相同。
CSV SHA-256:
abb68a057f68e4d9d37eae76d31354555d30f76a88554d0d1c04315598c7268f。Tera/当前完整产物聚合 SHA-256:
142799d06157ad506f95aa3c71c317fabb1e6b5ceb86d6d85909dd660299cf38。
资源版本的生产默认 requests=16,384 无法完成该完整站点;成功比较仅在临时 CLI 显式设 1,000,000 请求,仍正常授权、版本检查与计费。默认额度失败单列如下,不参与加速比:
版本 | 返回码 | 到失败的 wall s |
|---|---|---|
resources | 1 | 1.057 |
modules | 1 | 1.035 |
listen | 1 | 1.041 |
memo-off | 1 | 1.033 |
memo-compile | 1 | 1.052 |
memo-both | 1 | 1.073 |
head | 1 | 1.109 |
working | 1 | 1.088 |
5. 方法、可复现性与限制
AMD Ryzen 9 9950X3D2 16-Core Processor;Linux-7.2.12-x86_64-with-glibc2.44;rustc 1.97.1;Python 3.14.8。
CPU 8,频率策略
{"scaling_min_freq": "614286", "scaling_governor": "powersave", "scaling_max_freq": "5665080", "scaling_driver": "amd-pstate-epp"};没有固定频率。release debug=0、incremental=0、jobs=2。每个普通版本独立 Cargo target;编译和正式计时不并发。曾发现共享 target 的旧源码时间戳误复用,初轮全部弃用,重新隔离构建后才测量。
wall 含进程启动、Python prepare、Rust 管线、模板、文件发布及旧输出清理。温文件缓存、不做 fsync;不代表冷盘、增量构建或持久化写入速度。
wait4 的 ru_maxrss 单位 KiB,非进程树同时内存总和。user/system 也按 wait4 口径记录。
前七个引擎恢复当时未提交的 publication 路径优化,避免拿未优化的平方级路径扫描当基线。存档 Handlebars 的上下文复用未提交源码未恢复,表中单独标明。
Python 三档脚本通过消费者 git 历史提取;品牌、CSV、静态搜索索引、内容及输出路径固定,未引入后续项目更名。每个点是累计版本,收益与顺序有关,不能当成相互独立的优化收益。
当前工作区包括尚未提交的 str、arr.len、for 等语言能力,但这里仍运行同一生产模板负载。另一次约 53–56 s 的 notc 正文验收是不同宿主与页面模型,不作为本表回退基线。
结果目录:
/tmp/opencode/xiv-history-20261102。普通二进制、源码快照、探针补丁、固定输入、逐次 stdout/stderr、wait4 原始记录与逐文件指纹均保留。integrity.json记录样本数、二进制校验、工作区 diff 保全和同进程输出验证;source-fingerprints.json保存每份源码快照的逐文件指纹;工具自身 6 项轻量回归通过。
复现使用新目录(已有目录可续跑原条件下的 build/run/profiles/report;改变条件应另开目录):
工具与方法说明:tools/XIV_HISTORY_PROFILE.md。机器可读汇总:结果目录的 summary.json、summary.csv;原始记录:runs.json、profiles.json。