移动端同步效率验证(2026-10-27)
改动与原因
- 同步扫描、哈希、编解码、网络与历史写入移至后台 isolate,避免占用阅读界面的执行线程。
- 同账号同仓库的同步与启动历史补齐共用写入队列,既有草稿保存、切库与退出登录屏障继续生效。
- 单次同步复用连接;普通一次性 API 请求仍各自管理连接,保留同实例并发请求的行为。
- 历史改为按版本存正文、最后原子提交轻量清单。小改动不再重写全部历史正文;查询先选版本,再读取所选正文。
- 保留两轮全库扫描,不增加跨次文件缓存。未变化的正文不重置编辑器;同步状态不使 Markdown 重新解析。
主机前后对比
方法
- Windows、Flutter 3.47.5 / Dart 3.13.4,使用
flutter test的真实 HTTP 与文件系统。 - 基线代码取改动前的 Git HEAD;优化版本走生产使用的后台 isolate 入口。
- cyb 桌面缓存提供 321 个当前文件、4911 个历史版本;为两个版本各建独立移动端副本。
- 本地模拟服务只读取原 cyb 缓存;所有改动发生在临时副本和内存服务中,不使用真实账号或访问线上服务。
- 每种情形各测一次。计时覆盖同步引擎,不含首页同步后的文件列表、收藏和远端列表刷新。
- 阶段计时来自进度切换;扫描、上传、下载是两轮之和,历史阶段包含最终同步状态落盘。
- 探针及改动前代码副本位于忽略目录
build/sync-perf/,不进入正式应用。
结果(毫秒)
| 情形 | 改动前总计 | 优化后总计 | 改动前历史阶段 | 优化后历史阶段 |
|---|---|---|---|---|
| 无改动 | 2050 | 2407 | 48 | 186 |
| 单篇本地小改动 | 8361 | 2496 | 6170 | 211 |
| 远端单篇小更新 | 7250 | 2178 | 5256 | 169 |
| 情形 | 版本 | 准备 | 扫描 | 上传 | 下载 | 历史 |
|---|---|---|---|---|---|---|
| 无改动 | 改动前 | 41 | 1906 | 1 | 54 | 48 |
| 无改动 | 优化后 | 38 | 2101 | 2 | 80 | 186 |
| 本地小改动 | 改动前 | 36 | 1986 | 49 | 120 | 6170 |
| 本地小改动 | 优化后 | 33 | 2048 | 49 | 155 | 211 |
| 远端小更新 | 改动前 | 36 | 1829 | 0 | 129 | 5256 |
| 远端小更新 | 优化后 | 32 | 1823 | 0 | 154 | 169 |
- 小改动总耗时分别减少约 70% 和 70%;剩余主要成本是每次读取并计算所有受管文件的两轮扫描。
- 无改动同步没有变快;新 worker 需要加载、校验轻量历史清单,单次样本也受文件系统缓存和并行测试负载影响。
- 首次完整下载历史单独计时:旧格式 13693 ms,新格式 42686 ms。新格式首次须逐版本校验、写入和刷盘,不能当成日常增量同步耗时。
- 以上是主机、本地网络和单次样本,不代表真实手机或公网耗时,也不是 1 秒以内承诺。
Android 模拟器
- Android SDK x86_64 模拟器,Debug 模式,同一 cyb 隔离副本与本地 HTTP 服务。
- 长笔记使用实际
NoteContent,同步时持续滚动;帧统计覆盖同步及结束后的 500 ms。
| 情形 | 同步引擎耗时 | 采样帧数 | 构建帧 P95 | 光栅帧 P95 |
|---|---|---|---|---|
| 无改动 | 2972 ms | 138 | 17.674 ms | 24.908 ms |
| 本地小改动 | 2568 ms | 172 | 7.986 ms | 16.133 ms |
| 远端小更新 | 2187 ms | 154 | 6.800 ms | 15.932 ms |
- 首次完整下载新格式历史:34830 ms,单独统计。
- 连续同步期间进行真实触摸滑动,正文从第 23 段滚到第 32 段,同步状态仍显示进行中;最终滚动偏移继续增加。
- 单独测量同步后刷新 I/O:735 ms,包含 185 篇 Markdown 的列表和文件时间、历史身份与时间摘要、一个打开笔记的正文、最近记录、本地库和远端列表;不包含收藏同步、大纲后台更新或完整首页重绘。
- Debug 模式启动与首次显示长笔记出现过明显慢帧;这里验证的是预热后的增量同步期间持续阅读,不能据此宣称所有场景无掉帧。
- 尚未测真实手机和公网连接。
回归验证
- 最终全量
flutter test:565 项通过,包含普通 API 同实例并发连接回归。 - 真实 worker:进度传递、HTTP 401 类型与状态码、格式错误、失败后重试、启动历史与另一轮同步排队。
- 历史:未变化版本正文不重写、无改动不发请求、不读无关正文、时间截点与修改时间、分页中断不推进清单、重试、正文损坏重建、账号隔离、旧文件保留。
- 阅读:预览与编辑视图同步期间可拖动滚动;状态切换与未变化正文保持 Markdown 实例、滚动位置、选择与 composing 状态。
flutter analyze:本次代码无新增问题;仓库原有test/mp3/mp3_refresh_view_test.dart:37缺少大括号的 info 提示仍存在。
APK 验证
- 使用项目约定的
JAVA_TOOL_OPTIONS临时 socket 目录后执行flutter build apk --debug --target-platform android-arm64,android-x64,构建成功。 - 检查 APK 同时包含
arm64-v8a和x86_64Flutter 库;重新安装正式lib/main.dart入口 APK 到模拟器,替换临时探针。 - 构建中 Windows Dart 3.13.4 的编译进程曾以
ExceptionCode=-1073741819崩溃;同命令重试成功。此错误发生在 Dart kernel 编译阶段,并非此前的 Java socket 错误。
升级说明
- 安装新 APK 后重新启动应用。
- 不读取或迁移
mobile-history-v1,旧文件保留;首次历史查询或同步重新下载新格式历史,会增加耗时、流量及本地占用。 - 服务端协议和正文同步基线不变。
