低配电脑与大文件性能优化
结论与边界
本轮针对首次加载、文件切换、滚动、章节定位和光标移动,完成四组实现与回归验证。没有关闭 Markdown 功能、缩小不可见输入框字体、截断源文或改变保存策略来换取速度。
软件渲染测试通过,不等于低配无显卡真机已经验收。 本机为 i9-14900KF、约 64 GiB 内存、RTX 4070,CPU 和内存明显高于目标设备。软件渲染轮次通过 Flutter 的引擎启动参数请求 Skia 软件后端,报告记录 softwareRenderingRequested: true;不能据此推导低端 CPU、远程桌面、缺失图形驱动的环境也有相同耗时。
实现
| 路径 | 本轮优化 | 不变的行为 |
|---|---|---|
| 首次打开 / 恢复工作区 | 超过或等于 256 Ki 个 UTF-16 单元的文档在独立 isolate 解析;解析模型直接交给新会话,避免主线程再解析一次 | 原始文本、编码与换行记录、保存基线;迟到的打开结果不能抢占新草稿或新选择 |
| 字数 | 每个编辑控制器按不可变文档模型缓存字素数,移动光标、保存和切回已打开文档不重复扫描全文 | 组合字符、emoji 按用户感知字符计数,不用 UTF-16 长度冒充字数 |
| 大纲 | ListView.builder 只建立视口及缓存区的标题行,按文档保存列表滚动位置 |
所有章节仍可访问,样式、点击选中和编辑定位保持一致 |
| 章节跳转 | 隐藏导图不再为了选中章节强行生成树与布局;显示导图时再同步内容和选中节点 | 文本选区和导航请求不变;显示中的导图仍及时更新 |
| 导图切换文档 | 更换根节点时只计算一次布局 | 清除上一文档的折叠、选中状态,仍请求适配画布 |
| 远距离跳转动画 | 跳过中间视口,只动画移动最后约 0.6 屏 | 邻近跳转保留原动画;减少动态效果时直接定位;用户操作和控件销毁可以取消动画 |
| 即时编辑 | 内容块列表和键索引按文档模型、活动编辑范围缓存;光标或外观变化不重建全篇索引 | 编辑、拆分、撤销、替换文档时重新建索引,仍由原文及共享历史决定状态 |
flowchart LR
A[异步读取文件] --> B{文档大小}
B -->|小文档| C[直接解析]
B -->|大文档| D[后台 isolate 解析]
C --> E[复用不可变解析模型]
D --> E
E --> F[检查打开请求与窗口存活状态]
F --> G[当前文档或后台标签]
G --> H[只构建可见正文与大纲]源文输入后的解析仍为同步全量解析。本轮只把首次打开与工作区恢复的大文件解析移到后台,不能把它描述为完整的增量编辑引擎。
样本与方法
- Windows x64 原生 Profile,Flutter 3.47.7 / Dart 3.13.5。窗口外框 1280 × 900,最终采样客户区 1264 × 891,DPR 1,明亮主题、大纲展开、动态效果开启。
- 公开生成 Markdown,含标题、粗体、斜体、行内代码和链接,不读取用户文档。三千章节样本为 1,416,917 字节;一万章节样本为 4,748,918 字节。另有 54,836 字节的小文件参与往返切换。
- 文件使用本机临时目录和真实文件服务读取,设置与恢复仓储使用内存实现,不接触个人配置。测试结束清除自身临时目录。
- 每轮 23 项操作:打开大小文件、往返切换三轮、阅读 / 即时编辑 / 源码三个视图分别远跳三次、连续移动光标 20 次、连续滚动 30 次。
- 每项核对源文和未修改状态;增强版还核对阅读与即时编辑中目标章节确实在视口内,并导出三个视图的截图。
actionMs是命令完成时间,wallMs还包含测试泵帧与全部动效等待;eventLoopMaxGapMs是 5 ms 心跳的最大间隔,不是严格的键盘输入延迟。- 构建和栅格时长来自
FrameTiming。P95 为本次操作内的采样百分位,不是多机、多轮统计。framesOver16ms指构建或栅格任一阶段超过 16.667 ms,并不是完整端到端掉帧率。RSS 为操作结束采样,不是进程连续峰值。
同机对照
三千章节基线为 89245f5;第一阶段、后台解析、短距离动画依次对应 f2270a3、af46b00、be5849d,结构索引缓存为 8914f67。
| 项目 | 修改前 | 对应优化后 |
|---|---|---|
| 第一次大文件打开的主线程最大心跳间隔 | 77.9 ms | 27.9 ms(后台解析轮次) |
| 同次打开至完全空闲 | 158.0 ms | 158.0 ms(不是总加载时间加速) |
| 首次阅读远跳第 2,700 章的命令同步耗时 | 98.2 ms | 0.037 ms(隐藏导图不再生成) |
| 阅读远跳第 2,700 章的 P95 构建 | 7.73 ms | 1.20 ms(短距离动画轮次) |
| 一万章节即时编辑光标移动的 P95 构建 | 29.35 ms | 3.77 ms(相同软件渲染请求) |
| 同上超预算帧 | 20 / 21 | 0 / 21 |
| 一万章节即时编辑远跳第 9,000 章的最大构建 | 23.36 ms | 4.67 ms |
| 一万章节即时编辑滚动的 P95 构建 | 1.42 ms | 0.71 ms |
前四项使用未增加滚动位置采样的同版计时程序;后四项使用增强版程序,直接比较索引缓存前后的一万章节轮次。不同采样版本的 actionMs 不直接交叉计算加速比例。
文件切换原本已经复用打开的编辑会话,本轮主要消除了切换后的重复字数和大纲构建,没有声称磁盘读取或文件切换获得数量级加速。
阅读视图的 wallMs 仍约 1.2–1.9 秒,但增强采样显示正文滚动在约 250–270 ms 时已经结束,剩余时间包含后续非滚动动效等待。不能把完全空闲耗时解释为正文一直卡住,也不能反过来忽略这一段后台帧的能耗。
一万章节软件渲染轮次的首次加载仍有超过 16.667 ms 的构建帧。后台解析改善界面响应,不会消除全部冷启动、字数首次统计、字体及初次控件布局成本。并行测试及系统调度也会影响单轮观测,不能承诺所有操作稳定在一帧之内。
原始结果
旧版前三份数据中的 viewport 曾错误输出为 Instance of 'Size';增强后的采样程序已经记录数值宽高。旧轮次使用相同窗口初始化参数,没有用错误字符串推导屏幕大小。
回归验证
- 静态分析通过。核心 21 项、编辑器 201 项、导图 14 项、应用 187 项,共 423 项 Dart / Flutter 测试通过;脚本测试 26 项 通过。
- 新增测试覆盖后台解析让出主线程、CRLF / Unicode 范围及干净保存基线、迟到打开不抢占新草稿、字素计数在选择 / 保存 / 撤销后的正确性、大纲只建立可见行、隐藏导图延迟更新并保留章节选中、远跳不建立大量中间行及动画取消。
- 最终三千章节默认后端、一万章节软件渲染请求,各 23 项原生操作通过,目标章节可见、全文不变且不变脏。两个轮次各输出阅读 / 即时编辑 / 源码截图,检查无空白画面及明显布局溢出。
- 原有 285,449 字符富文本输入压力测试复跑通过:进入编辑、输入 / 撤销 12 轮、全文选择 / 收起 6 轮、全文替换和撤销,共 39 项操作;结果数据。这不代表真实 Windows 输入法候选已经验收。
- 本机安装包使用正式
lib/main.dart入口重新构建和封装,不把集成测试程序当作产品程序;本轮不自动安装、不更换应用身份、不升级版本或发布标签。
复测
在 apps/vex 执行,输出目录可自行调整:
$env:VEX_LOW_RESOURCE_OUTPUT = "$PWD/../../artifacts/performance/default.json"
flutter drive --profile -d windows --driver test_driver/integration_test.dart --target integration_test/low_resource_performance_test.dart --no-pub
$env:VEX_PERFORMANCE_CHAPTERS = '10000'
$env:VEX_LOW_RESOURCE_OUTPUT = "$PWD/../../artifacts/performance/software.json"
$env:VEX_LOW_RESOURCE_CAPTURE_DIR = "$PWD/../../artifacts/performance/captures"
flutter drive --profile -d windows --enable-software-rendering --driver test_driver/integration_test.dart --target integration_test/low_resource_performance_test.dart --no-pub--enable-software-rendering 是本轮固定 Flutter 版本支持、但已经标记 deprecated 的开发工具选项。不是直接把同名参数追加给已安装的 vex.exe,也没有把所有用户强制切到软件渲染。Windows 启动器原有 Skia 设置保持不变。
下一步验收
- 在真实低配 / 集成显卡电脑上,使用 Profile 或 Release 复测并记录 CPU、内存、驱动、DPI 与功耗。
- 继续覆盖 10–50 MB、超长单段、巨型表格 / 代码块、图片密集文档、复杂 Mermaid 和大导图。块级按需显示不代表单个巨型块也已逐行虚拟化。
- 检查超大文件持续输入、中文输入法候选和全文选择;同步全量解析与全文撤销快照仍有时间和内存成本。
- 大目录文件树的缓存与按需建立行、增量解析、基于差异的有界撤销历史,保留为后续单独验证的工作,不混入未经测量的大范围重构。
- 在 macOS、Linux、Android 及其他目标设备原生复测。本轮 Windows 与桌面缩小窗口测试不能代替其他平台验收。
有疑问或建议,欢迎到 GitHub 提交 Issue 参与讨论。