本轮按实际影响从高到低处理翻译调度、滚动布局和动画内存。测试使用本地模拟翻译服务和真实已安装内核,没有调用外部付费服务。原始数据见 performance-review-2026-10-04.json。
调度基准对照从本轮开始时的 Git HEAD 导出隔离源码,使用相同测试程序和真实 Fast 内核;每次使用独立缓存。它测量缓存页被后台工作阻塞的场景,不代表未缓存翻译也获得同样倍数的加速。
普通 Fast 基准为 30 页、每页 6 段、模拟 provider 每段等待 200 ms,依次翻译第 1、15、30 页,最后读取第 1 页缓存。未缓存响应中位数本轮前后为 3332.4 / 2587.8 ms,缓存响应为 6.1 / 3.0 ms。Python 导入和字体子集耗时也随机器负载变化,调度补丁没有修改这两项,不把这个未缓存耗时差值归因为补丁收益。本地剩余主要成本仍是 Python/模型初始化、页面处理和字体子集;真实网络延迟还可能更高。
字体 native subsetter 的试验虽然缩短了 subset 阶段,却使后续序列化/进程总时间明显增加,已经撤回。保留原内核字体嵌入及子集逻辑。
桌面基准使用同一 1000 页混合横竖版 PDF,连续打开三次,包含滚动、侧栏切换及窗口 resize。裁剪功能来自同期其他工作,本轮保留其行为,并修复其布局依赖回归。裁剪改动前的滚动 p95 为 9.4 ms,出现回归后为 34.3 ms,修复后为 9.3 ms;最终首屏中位数 463.1 ms,相比最初 434.2 ms 没有首屏加速结论。
Renderer + backend 的采样 RSS 峰值中位数最初为 780.5 MiB,最终为 801.7 MiB,没有证据证明总 RSS 下降。这些数值可能重复计算共享驻留页,且不含 Python worker、main/GPU。快照改动控制的是短时额外分配和释放时机。
npm test:38 / 38 通过(安装前最终复测)。npm run build:通过。node server/kernel-smoke.mjs:Fast/Precise 的真实并发、可读译文、段落坐标、缓存、provider 错误及取消通过。node server/fast-benchmark.mjs:真实 Fast 基准通过。node_modules/.bin/electron . --smoke-test=benchmark:最终 1000 页桌面基准通过,滚动长任务计数为 0。node_modules/.bin/electron . --smoke-test=animation:文字逐字动画、原始 PDF 字形、快速切换清理、减少动态效果、Fast 到达及返回动画通过。修正了测试的两个旧问题:按钮 8 px 装饰 halo 被误算为文字溢出,以及仍使用已移除的 kernel-switcher selector。文字横向溢出仍检查实际文本 scroller。node_modules/.bin/electron tests/desktop/motion-memory-smoke.mjs:真实 canvas 分配上限和释放检查通过。- 额外的
layout-settingssmoke 在键盘切换 Precise 的保存等待处超时;此轮未修改该键盘处理路径,该项仍未验证通过。
npm test
npm run build
SCHEDULING_OUTPUT=/tmp/reader-scheduling.json node server/scheduling-benchmark.mjs
FAST_BENCHMARK_OUTPUT=/tmp/reader-fast.json node server/fast-benchmark.mjs
PDF_READER_BENCHMARK_LABEL=review node_modules/.bin/electron . --smoke-test=benchmark
node_modules/.bin/electron . --smoke-test=animation
node_modules/.bin/electron tests/desktop/motion-memory-smoke.mjs页面裁剪、翻译调度、动画快照清理和 Fast CJK 段首缩进修复已合并到本次本地构建。Fast 对中文、日文、韩文译文中继承的原文首行缩进统一使用两个全角空格;无原文缩进的段落及其他目标语言保持原有规则。CJK 使用新的排版缓存版本,避免复用旧缩进的 PDF;其他语言保留兼容缓存。
本次重新运行 npm test,38 / 38 通过;新增测试验证旧 schema 4 CJK 排版缓存不会被复用,新 schema 5 缓存仍可绕过 worker 队列。前端构建、裁剪及动画桌面 smoke 通过。此前已使用真实 Fast 内核及本地模拟服务验证带缩进段落的两个全角空格。
macOS arm64 应用通过固定证书签名及 codesign --verify --deep --strict,安装到 /Applications/PDFMathReader.app 并启动。安装后的 app.asar 和 kernel-worker.py 与构建产物逐字节一致。旧版备份位于 /Users/rongxin/Library/Application Support/PDFMathReader/backups/20261004-222643/PDFMathReader.app。
最终再次安装后的 app.asar SHA-256 为 70a1c115d31cc660b1cef18ca286efc9f8d1d2282dbe9b29d83206fdc98878bf,与签名构建产物一致;深度严格签名验证通过,已启动。此次替换前的应用另备份至 .cache/install-backups/20261004-222730/PDFMathReader.app。Fast CJK 的新排版缓存版本保持升级,旧排版缓存按预期失效。
