本文用于长期记录 tswn_core 在 tswn-cli bench win-rate 路径上的性能结果,方便横向比较:
- Bun / JS 历史参考
0.2.120.2.130.2.140.2.200.3.10.3.20.4.0Runtime
当前这份记录重点对应:
0.2.20在一轮结果一致性 / SBY diff 收口后,继续回收pre_action/Hide/ alive-group 热路径的性能回退0.3.1在补齐 WASM 查询接口后,按同口径补跑 benchmark,确认当前版本没有新异常,但相较0.2.20有一小段性能回退0.3.2新增 DIY / overlay 覆盖系统,按同口径补跑确认非 DIY 通路无性能回退- 当前表格已同步到
0.3.2的稳定重跑结果,可直接和0.3.1、0.2.20、0.2.14做横向比较 0.4.0的 fixed30、score、win-rate 与 CQP/CQD 统一结果另见docs/perf/runtime_0.4.0_baseline.md0.5.0主 Runtime 独立化后的完整发版结果与 0.4.3 同机交替 A/B 见docs/perf/runtime_0.5.0_749fcd1_release_benchmark.md
- 编译参数:正式留档使用
--release --features no_debug;日常快速试跑可用--profile release-fast --features no_debug,但不要和长期表格混用。0.4.0起原生默认 feature 包含mimalloc_alloc;旧版本未启用 allocator 的历史数据保留原口径,不反向改写。 - CLI:
tswn-cli bench win-rate ... --perf - 单线程:追加
--single-thread - 多线程:直接使用 CLI 默认线程策略
- 样本:
aaavsbbb喘际瞬爆@昀澤vs蕾蒂·怀特洛可-65HEZHB264LFPFQ@Squall
说明:
-
Runtime
0.4.0的当前回归基线与 legacy score 硬目标见runtime_0.4.0_baseline.md; -
Runtime
0.5.0的发版基准与 3% 回退门禁见runtime_0.5.0_749fcd1_release_benchmark.md; -
Bun与0.2.12的数据来自docs\update\0.2.12.md中的同机历史记录; -
0.2.13数据来自 detached worktree:f9b0e3c; -
0.2.14数据来自当时主线; -
0.2.20数据来自当前工作树(已步进版本号并继续回收本轮性能回退); -
0.3.1数据来自当前工作树(2026-05-10 按同口径补跑); -
100k更适合做快速横向参考; -
1M更适合做当前版本之间的稳定吞吐比较。
docs/perf/fixed_cases_30 保留了覆盖 1v1、2v2、多人、队伍、FFA 与复杂状态链的
30 个固定输入。0.5.0 删除旧执行器时,同时删除了依赖双栈对账的 track_perf_cases、
track_score_perf 等辅助 binary;历史文档中的对应命令不再适用于当前分支。
0.5.0 的 fixed30 与 score 发版测量使用只调用公开主 Runtime API 的临时外部 harness,
构建后未保留源码。被测提交、输入哈希、逐轮中位数和同机 A/B 结果见
runtime_0.5.0_749fcd1_release_benchmark.md。
固定输入与 0.4.x 的旧工具输出格式说明继续保存在
fixed_cases_30_benchmark.md,仅作为历史口径。
当前仓库可直接复测的长期入口是 tswn-cli bench win-rate --perf 与 OpenBox
openbox_mem_probe;命令和发布要求见根目录 rule.md。如需恢复 fixed30 自动化,
应新增只依赖公开主 Runtime API 的独立 benchmark harness,不得恢复旧执行器或 parity 入口。
| 样本 | Bun 参考 | 0.2.12 |
0.2.13 |
0.2.14 |
0.2.20 |
0.3.1 |
0.3.2 |
|---|---|---|---|---|---|---|---|
aaa vs bbb |
12.674s (1.00x) |
1.981s (6.40x) |
1.992s (6.36x) |
1.825s (6.94x) |
1.887s (6.72x) |
1.922s (6.59x) |
1.901s (6.67x) |
复杂样本 |
15.524s (1.00x) |
3.014s (5.15x) |
3.077s (5.05x) |
2.792s (5.56x) |
2.891s (5.37x) |
2.985s (5.20x) |
2.951s (5.26x) |
| 样本 | Bun 参考 | 0.2.12 |
0.2.13 |
0.2.14 |
0.2.20 |
0.3.1 |
0.3.2 |
|---|---|---|---|---|---|---|---|
aaa vs bbb |
12.674s (1.00x) |
0.269s (47.12x) |
0.279s (45.43x) |
0.278s (45.59x) |
0.291s (43.55x) |
0.294s (43.11x) |
0.301s (42.11x) |
复杂样本 |
15.524s (1.00x) |
0.411s (37.77x) |
0.403s (38.52x) |
0.375s (41.40x) |
0.471s (32.96x) |
0.400s (38.81x) |
0.396s (39.20x) |
注:100k 的多线程 wall-clock 很短,容易受机器瞬时负载和调度抖动影响,因此真正判断版本间稳定差异时,应继续看下面的 1M 表。
| 样本 | 0.2.13 |
0.2.14 |
0.2.20 |
0.3.1 |
0.3.2 |
0.3.2 vs 0.3.1 |
0.3.2 vs 0.2.20 |
|---|---|---|---|---|---|---|---|
aaa vs bbb |
19.636s |
18.144s |
18.438s |
19.339s |
19.333s |
~持平 | 慢 4.9% |
复杂样本 |
30.239s |
27.851s |
28.488s |
30.181s |
29.437s |
快 2.5% |
慢 3.3% |
| 样本 | 0.2.13 |
0.2.14 |
0.2.20 |
0.3.1 |
0.3.2 |
0.3.2 vs 0.3.1 |
0.3.2 vs 0.2.20 |
|---|---|---|---|---|---|---|---|
aaa vs bbb |
2.523s |
2.516s |
2.784s |
2.884s |
2.800s |
快 2.9% |
慢 0.6% |
复杂样本 |
3.859s |
3.473s |
3.749s |
3.811s |
3.885s |
慢 1.9% |
慢 3.6% |
| 样本 | 单线程 100k |
多线程 100k |
单线程 1M |
多线程 1M |
|---|---|---|---|---|
aaa vs bbb |
1.901s |
0.301s |
19.333s |
2.800s |
复杂样本 |
2.951s |
0.396s |
29.437s |
3.885s |
0.3.2vs0.3.1:四项 1M 偏差均在 ±3% 以内,属于同机重跑的正常波动。DIY overlay 的修改没有造成非 DIY 通路的性能回退 —— 所有新增判断都是对Option<PlayerOverlay>(None)的指针判空,分支预测器稳定命中,热路径无变化。- 相较
0.2.20,0.3.2在 1M 口径下:- 单线程慢约
3.3%~4.9% - 多线程慢约
0.6%~3.6%
- 单线程慢约
- 相较
0.2.14基线仍有一定回退(与0.3.1基本一致),这部分回退来自0.3.0引入的 WASM 相关接口层展开,非本次改动引入。 - 综合来看:
0.3.2=0.3.1的性能 + overlay 新功能,无额外性能代价。