Uninote
Uninote
用户根目录
brdr
common
programming
docs
tests
后端试题
问题讨论

移动端同步效率验证(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_64 Flutter 库;重新安装正式 lib/main.dart 入口 APK 到模拟器,替换临时探针。
  • 构建中 Windows Dart 3.13.4 的编译进程曾以 ExceptionCode=-1073741819 崩溃;同命令重试成功。此错误发生在 Dart kernel 编译阶段,并非此前的 Java socket 错误。

升级说明

  • 安装新 APK 后重新启动应用。
  • 不读取或迁移 mobile-history-v1,旧文件保留;首次历史查询或同步重新下载新格式历史,会增加耗时、流量及本地占用。
  • 服务端协议和正文同步基线不变。

2026-10-27-sync-file-access

测试

点赞(0) 阅读(12) 举报
目录
标题