review(follow-ups): 落地上轮建议并给出实测结论(#2/#4 回退、#3 不重写)
一、Tools 完善 * OffscreenChecks `edgestats`:改为自动挑"最有起伏"的信号。旧实现固定取 `signals[0]`,而 MF4 的第一条信号是常量(6000)⇒ 三个阈值的断言退化成 "0 == 0" 的空转。现在扫描前 200 条挑 `max-min` 最大者,SCATTER_TEST 上 三个阈值分别得到 (20,19)/(20,19)/(20,19),与独立参考实现逐位相同。 * UnitTests 新增 `stdio_mingw_vs_ucrt_formats`:把 MinGW ANSI stdio 与系统 UCRT 的 printf 在**本程序实际用到的全部格式**(`%.*f` / `%.6g` / `%g` / `%.4e` / `%.2f %ls` / `%llu` / `%lld` / `%02X` / `%.2f%%`)上做逐字符比对, 13.6 万次调用 **0 处差异**(覆盖 1e-40~1e40)。它是"把 swprintf 让给 UCRT" 这条体积优化的验收标准。 * Tools/README.md:同步新增用例与断言数量(219 项 / 18 用例)。 二、第 33 轮报告 §10 后续建议的结论(详细数字见 Progress 第 34 轮) 1. **`EdgeScanFor` 状态查找哈希化:实测后回退。** 实现方式为 `deque` + `unordered_multimap<keyHash, EdgeScanState*>`(桶内仍 逐字段比对,碰撞安全;新建/淘汰/定向作废/清空四处同步索引),功能与像素 验证全绿。但 198 个状态的整轮查询只从 0.097 降到 0.073 us/query(一轮省 ≈4.8 us),而产物体积 +5,632 B。⇒ 回退。 同时修正报告的量级:原估"288 信号 ≈0.3ms/帧",实测 ≈20us/帧。 2. **`EdgePanelLayoutFor` 表驱动化:不做。** 实测 1.9~2.5 us/次(每帧约 14 次 ≈30us),不是热点;第 33 轮已消除"按种类分派"的重复,剩余 957 行是几何算式 本身,无法表驱动。本轮改为交付"让这类重写可验证"的手段: `-run panels -mode record/compare` 逐面板比对几何 + 像素哈希。 3. **`wcstod` 自写替身:实测 0 字节收益。** 只加 `-D__USE_MINGW_ANSI_STDIO=0` 全量重编后产物仍是 788,480 B、`mingw_wpformat.o` 仍被链接。原因是预编译 libstdc++ 自己引用 `__mingw_swprintf`:只要还调用 `std::to_wstring` / `std::to_string`(全仓约 80 处,若干处实参是浮点), gdtoa 必然被链入。⇒ 回退,并在 Makefile 留下说明防止重复尝试。 三、文档 * `Documents/Code_Review_Plan.md` 新增 §六(第 34 轮节点与验收标准)。 * `Documents/Code_Review_Progress.md` 新增第 34 轮逐节点记录(含全部实测数字)。 * `Documents/Code_Review_Report.md` 新增 §11(结论表 + 两处量级修正 + 更新的后续建议)。 * `Documents/agent_mem.md` 新增第 34 轮规则:Tools 约定、两个构建陷阱、 两条"别再重复做"的实验结论。 验证: * `make release`(删 .o 全量)零 error / 零 warning,产物 **788,480 B**(与改动前一致)。 * `make -C Tools` 零 error / 零 warning。 * `UnitTests.exe` → checks=219 failed=0 cases=18。 * `OffscreenChecks.exe -all` → 5/5 检查 PASS,checks=71 failed=0。
This commit is contained in:
1 parent
97e9163314
commit
5c48bf922e
8 files changed
+418
-2
No files matched your search
@@ -10368,3 +10368,64 @@ release/debug **零警告**;Release `TargetCheck.exe` **890,880 B**(< 1 MB
|
||||
288 信号时每帧约 16 万次比较(~0.3ms 量级)。可改哈希索引,但收益有限、风险不小。
|
||||
* `SceneContentHash` 里 6 段逐面板混入循环未合并(同上:无法验证"仅失效条件不变")。
|
||||
|
||||
---
|
||||
|
||||
## 2026-11-04 · 第 34 轮(`Code_Review` 分支):验证工具入库 + §10 建议的实测结论
|
||||
|
||||
> 计划 `Documents/Code_Review_Plan.md` §六,逐节点 `Documents/Code_Review_Progress.md` 第 34 轮,
|
||||
> 结论 `Documents/Code_Review_Report.md` §11。工具说明见 `Tools/README.md`(改工具必须同步它)。
|
||||
|
||||
### 1. ⭐ `Tools/` 已入库:验证能力变成"仓库资产"
|
||||
|
||||
* `.gitignore`:删掉整目录忽略的 `Tools/`,改为 `Tools/**/Build/`;
|
||||
**工具产物与临时文件都不得入库**(截图/基线/报告写 `Temp/tools/`)。
|
||||
* `Tools/Makefile`:`make` 全部、`make UnitTests`、`make OffscreenChecks`、`make clean`、`make help`。
|
||||
工具链接本体 `../Build/Release/*.o`(排除 `Main.o`)⇒ **改完本体必须先 `make release`**。
|
||||
* `Tools/UnitTests`:219 条断言 / 18 用例(解析逐位一致、格式化、公式、变换、滑动平均、公式缓存)。
|
||||
* `Tools/OffscreenChecks`:`smoke` / `frames` / `panels` / `edgestats` / `perf`,共 71 条断言。
|
||||
窗口 `SW_HIDE` + `Application::HandleMouseMove()` 合成鼠标 + 读后备缓冲区;**不占用用户屏幕/输入**。
|
||||
|
||||
### 2. ⚠️ 两个必须记住的构建陷阱
|
||||
|
||||
1. **工具源码不能加 `-flto`**:本体目标文件是 LTO 字节码,链接时必须
|
||||
`-flto -flto-partition=one`;但把**工具源码**也交给 LTRANS 会让 GCC 15.2.0 在
|
||||
`choose_baseaddr`(i386.cc:7447)**ICE**。⇒ 只在链接参数里带 LTO。
|
||||
2. **`Tools/Makefile` 必须 `.DEFAULT_GOAL := all`**:用 `$(foreach)` 生成的目标会先于 `all`
|
||||
出现,make 会把第一个显式目标当默认目标 ⇒ 否则直接 `make` 只构建第一个工具。
|
||||
|
||||
### 3. ⛔ `EdgeScanFor` 状态查找哈希化:**实测后回退**(别再做一次)
|
||||
|
||||
* 改法(已回退):`vector` → `deque`(指针稳定)+ `unordered_multimap<keyHash, EdgeScanState*>`,
|
||||
桶内仍逐字段比对;新建/淘汰/定向作废/清空四处同步索引。功能与像素均验证通过。
|
||||
* **数字**:198 个状态整轮查询 `0.097 → 0.073 us/query`(一轮省 ≈4.8 μs);
|
||||
产物 **788,480 → 794,112 B(+5,632 B)**。
|
||||
* **结论**:体积换 5 μs/帧不成立,已回退。
|
||||
* ⚠️ **同时修正第 33 轮报告的量级错误**:那里估"288 信号时 ≈0.3 ms/帧",
|
||||
实测 198 状态整轮只有 **≈20 μs/帧**(差一个数量级)。**不要再按 0.3ms 去优化这条路径。**
|
||||
|
||||
### 4. ⛔ 仅切 `__USE_MINGW_ANSI_STDIO=0`:**0 字节收益**(别再做一次)
|
||||
|
||||
* 实测:加 `-D__USE_MINGW_ANSI_STDIO=0` 全量重编后产物**仍是 788,480 B**,
|
||||
map 里 `mingw_wpformat.o` + gdtoa 依旧在。
|
||||
* 原因(3 行最小程序确认):**预编译 libstdc++ 自己引用 `__mingw_swprintf`** ——
|
||||
只要还调用 `std::to_wstring` / `std::to_string`(全仓约 80 处,若干处实参是浮点),
|
||||
gdtoa 必然被链入。真要省这 33 KB 必须替换全部 80 处,风险与收益不匹配。
|
||||
* 该实验已回退,`Makefile` 里留了说明。**副产物**:`stdio_mingw_vs_ucrt_formats`
|
||||
(13.6 万次 `%.*f`/`%.6g`/`%g`/`%.4e`/`%.2f %ls`/`%llu`/`%lld`/`%02X`/`%.2f%%` 逐字符比对,
|
||||
0 差异)——将来真做迁移就是验收标准。
|
||||
|
||||
### 5. ⏸ `EdgePanelLayoutFor` 表驱动化:不是性能项,不重写
|
||||
|
||||
* 实测 **1.9~2.5 μs/次**(2000 轮 × 7 种面板),每帧约 14 次调用 ≈ 30 μs ⇒ 不是热点。
|
||||
* 第 33 轮已消除"按种类分派"的重复(`LanePanelEnabled`/`LanePanelStateOf`/`LanePanelScrollOf`),
|
||||
剩余 957 行的重复是**几何算式本身**,无法表驱动。
|
||||
* 这类重写若要动,必须先 `-run panels -mode record`,改完 `-mode compare`(几何 + 像素哈希逐面板比对)。
|
||||
|
||||
### 6. 本轮验证口径
|
||||
|
||||
* `make release` 全量:零 error / 零 warning;产物 **788,480 B**。
|
||||
* `make -C Tools`:零 error / 零 warning。
|
||||
* `UnitTests.exe` → `checks=219 failed=0`;`OffscreenChecks.exe -all` → 5/5 检查 PASS、`checks=71 failed=0`。
|
||||
* 单元测试写错过的 5 处"我以为的语义"(都已按产品语义修正):
|
||||
`9.999999999999999`(>15 位有效数字允许 1 ULP)、`1..2` 合法、`FormulaIsIdentity` 不去空格、
|
||||
非法公式 `EvaluateFormula` **原样返回采样值**(不是 NaN)。
|
||||
Reference in new issue
Block a user