维刻 Vex
GitHub
维刻 Vex / 文档 / 低配电脑与大文件性能优化

低配电脑与大文件性能优化

结论与边界

本轮针对首次加载、文件切换、滚动、章节定位和光标移动,完成四组实现与回归验证。没有关闭 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 屏 邻近跳转保留原动画;减少动态效果时直接定位;用户操作和控件销毁可以取消动画
即时编辑 内容块列表和键索引按文档模型、活动编辑范围缓存;光标或外观变化不重建全篇索引 编辑、拆分、撤销、替换文档时重新建索引,仍由原文及共享历史决定状态
mermaid
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 执行,输出目录可自行调整:

powershell
$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 参与讨论。
tems[selIndex] as HTMLAnchorElement).click(); } } });