Notist
On this page
  1. XIV DB 全历程性能对照(2026-11-02)
  2. 结论
  3. 收益与退化
  4. 1. 同批普通 CLI 对照
  5. 2. 阶段归因
  6. 当前版本详细阶段
  7. 3. comemo:同进程完整站点组装
  8. 4. 产物与默认额度
  9. 5. 方法、可复现性与限制

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;改变条件应另开目录):

python3 tools/profile_xiv_history.py prepare --out /tmp/opencode/xiv-history-NEW
python3 tools/profile_xiv_history.py build --out /tmp/opencode/xiv-history-NEW
python3 tools/profile_xiv_history.py measure --out /tmp/opencode/xiv-history-NEW --runs 5 --cpu 8

工具与方法说明:tools/XIV_HISTORY_PROFILE.md。机器可读汇总:结果目录的 summary.json、summary.csv;原始记录:runs.json、profiles.json。