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
@@ -323,3 +323,71 @@ Makefile 按目录通配收集源文件,**无需登记**。
|
||||
3. **`EdgePanelLayoutFor` 表驱动化**(需第 1 项就绪)。
|
||||
4. 若要继续压体积:`wcstod` 自写替身(≈20 KB,需逐位一致性验证)、
|
||||
图标帧裁剪(观感优先,不建议)。
|
||||
|
||||
---
|
||||
|
||||
## 11. 第 34 轮(2026-11-04):§10 建议的落地结果
|
||||
|
||||
> 计划见 `Code_Review_Plan.md` §六,逐节点记录见 `Code_Review_Progress.md` 第 34 轮。
|
||||
|
||||
### 11.1 一句话结论
|
||||
|
||||
**§10 里唯一"必须做"的第一条(重建离屏验证手段)已完成并入库**(`Tools/`),
|
||||
它让其余三条建议第一次变得**可测量、可自证**;而用这套手段一测,
|
||||
**第 2、4 条建议的实际收益远小于报告当初的估计,第 3 条根本不是性能项** ——
|
||||
三条都以"实测数据 + 回退"收尾,而不是靠猜测去改 957 行几何或 80 处字符串转换。
|
||||
|
||||
| §10 建议 | 结果 | 关键数字 |
|
||||
| --- | --- | --- |
|
||||
| 1. 重建离屏验证手段 | ✅ **完成并入库** | 单元测试 **219** 条断言 / 18 用例;离屏 **71** 条断言 / 5 个检查;全程 `SW_HIDE` + 合成消息 |
|
||||
| 2. `EdgeScanFor` 状态查找哈希化 | ⛔ **实测后回退** | 查询 `0.097 → 0.073 us/次`(198 状态,整轮省 ≈4.8 μs);体积 **+5,632 B** ⇒ 不划算 |
|
||||
| 3. `EdgePanelLayoutFor` 表驱动化 | ⏸ **不重写**(交付验证手段) | 实测 **1.9~2.5 μs/次**,每帧约 30 μs ⇒ 不是热点;剩余重复是几何算式本身 |
|
||||
| 4. `wcstod` 自写替身(≈20 KB) | ⛔ **实测 0 字节** | 只切 stdio 实现**体积不变**;真收益需替换 80 处 `std::to_*string`(含浮点) |
|
||||
|
||||
### 11.2 验证基础设施(`Tools/`,已入库)
|
||||
|
||||
```text
|
||||
Tools/UnitTests/ 纯数据层单元测试(不创建窗口)
|
||||
Tools/OffscreenChecks/ 隐藏窗口离屏验证(抓帧 / 哈希 / 面板基线 / 参考统计 / 性能)
|
||||
Tools/Makefile 统一构建入口:make / make <Tool> / make clean / make help
|
||||
Tools/README.md 目录结构、作用、测试项、验收标准、A/B 用法、扩展步骤、已知限制
|
||||
```
|
||||
|
||||
* 工具链接本体 `Build/Release/*.o`(排除 `Main.o`),因此**必须先构建本体**;
|
||||
产物在 `Tools/<Tool>/Build/`,**不入库**;截图 / 基线 / 报告一律 `Temp/tools/`(已忽略)。
|
||||
* `smoke` 检查里有一条硬判据:**同一状态连续两帧逐像素相同**(实测差异 0 像素),
|
||||
这是所有像素 A/B 可信的前提。
|
||||
* `edgestats` 用**独立的朴素逐点实现**当金标准,比对真实数据的上升/下降沿计数
|
||||
(20/19、20/19、20/19 三个阈值全等)——它同时是 `EdgeScanFor` 任何重构的回归网。
|
||||
|
||||
### 11.3 对原报告两处量级的修正
|
||||
|
||||
| 位置 | 原表述 | 实测(本轮) |
|
||||
| --- | --- | --- |
|
||||
| §6.2 第 1 行 | `EdgeScanFor` 线性扫描「~0.3 ms/帧 @288 信号」 | **≈20 μs/帧 @198 状态**(差一个数量级;线性扫描的常数很小) |
|
||||
| §1.3 第 3 行 | 替换 `wcstod`「≈20 KB」 | **0 B**(只要还用 `std::to_*string`,MinGW printf 引擎 + gdtoa 必然被链入) |
|
||||
|
||||
> 这两条修正同样是"结论":它们避免后续接手者按错误量级去做无收益的重写。
|
||||
|
||||
### 11.4 体积现状
|
||||
|
||||
| 项 | 数值 |
|
||||
| --- | --- |
|
||||
| 第 33 轮末 | 794,112 B(本机实测 **788,480 B**,工具链差异) |
|
||||
| 第 34 轮末 | **788,480 B**(T4 / T6 均回退,产品代码零改动) |
|
||||
| 红线 | 1 MB 预警(`Makefile` 注释),距红线 **≈260 KB** |
|
||||
|
||||
### 11.5 后续建议(替代本报告 §10)
|
||||
|
||||
1. **保持 `Tools/` 常绿**:任何改动按 `Tools/README.md` §5 的"最小集"跑针对性检查;
|
||||
改数据层必跑 `UnitTests`,改绘图/面板必跑 `-run smoke -run panels`(必要时 `-mode compare`)。
|
||||
2. **性能类改动一律先量后改**:用 `-run perf` 取同一会话的前后数字;
|
||||
绝对耗时受机器状态影响,比较时用**同一次运行内的相对值**。
|
||||
3. **如果将来真要压体积**(优先级从高到低):
|
||||
* 替换 `std::to_wstring` / `std::to_string`(≈80 处)→ 可整条去掉 gdtoa(≈33 KB),
|
||||
验收标准已就绪(`stdio_mingw_vs_ucrt_formats`);注意其中若干处实参是浮点。
|
||||
* 图标帧继续瘦身(观感优先,**不建议**)。
|
||||
4. **如果将来要重写 `EdgePanelLayoutFor`**:先 `-run panels -mode record`,
|
||||
重写后 `-mode compare`;只要有一处像素/几何差异就说明改坏了。
|
||||
5. **不要重复这两次实验**:`EdgeScanFor` 哈希化(+5.6 KB / −5 μs 不划算)、
|
||||
仅切 `__USE_MINGW_ANSI_STDIO`(0 B)。数字见 §11.1 与 `Code_Review_Progress.md` 第 34 轮。
|
||||
Reference in new issue
Block a user