Repository navigation
inkScroll 0.3.6
针对「网盘库里文件多了之后加载很慢」做了一轮实测优化:大库导入快约 3.8 倍。
瓶颈在哪(逐项量出来的)
| # | 问题 | 代价 |
|---|---|---|
| 1 | 扫描子目录串行(一个目录一次 PROPFIND) | 100 个文件夹光等就几十秒 |
| 2 | 每本书都新建连接(TCP + TLS 握手) | 100 本 = 100 次握手 |
| 3 | 每本嗅探 16 张图的尺寸 | 每本多十几倍往返 |
| 4 | 书架写入是 O(n²)(每本重写整个书架 JSON) | 越到后面越卡 |
| 5 | 启动时给整个书架生成封面 | 每本下载一整张原图 |
| 6 | 重复导入产生重复的书 | 书架越用越乱 |
改了什么
- 扫描并行 5 路,结果按原始下标放回,目录自然序不乱
- 整批复用同一个连接,最后统一关闭
- 嗅探样本 16 → 4:同一话里的图几乎总是同尺寸,中位数兜底足够
- 批量写入书架:一次读一次写;导入期间只攒元数据,整批结束才刷新 UI
- 封面按需生成:书架卡片可见时才请求;启动时只补本地库
- 按 (连接, 目录) 去重,重复添加会明确提示「都已在库里」
- HTTP 连接池固定
maxConnectionsPerHost=6,长连接复用
实测数据(A/B 基准,tool/bench_scan.dart)
12 本 × 20 页,用模拟服务器注入固定 RTT:
60ms RTT(较好的隧道)
| 阶段 | 优化前 | 优化后 | 加速 |
|---|---|---|---|
| 扫描 | 940 ms | 252 ms | 3.73x |
| 单本嗅探 | 302 ms | 77 ms | 3.92x |
| 整库 | 4.6 s | 1.2 s | 3.88x |
150ms RTT(较差的公网)
| 阶段 | 优化前 | 优化后 | 加速 |
|---|---|---|---|
| 扫描 | 2053 ms | 517 ms | 3.97x |
| 单本嗅探 | 645 ms | 170 ms | 3.79x |
| 整库 | 9.8 s | 2.6 s | 3.83x |
收益与 RTT 成正比 —— 符合「消除往返次数」的预期:网络越慢,提升越大。
顺带修掉的两个真 bug
upsertBooks会覆盖错书:最初「边遍历边 insert(0)」,头部插入让已记录的下标整体错位,按旧下标更新会写到别的书上 —— 书架出现重复项且书名错乱。这个问题是新加的单元测试抓出来的。- 测试服务器是串行的:
await for里直接 await 处理请求,用它跑基准会得出「并行没有用」的错误结论(实测只快 1.12x)。改为每请求独立 task 后才测出真实差距。
下载
| 架构 | 适用机型 |
|---|---|
inkscroll-0.3.6-arm64-v8a.apk |
绝大多数现代手机(推荐) |
inkscroll-0.3.6-armeabi-v7a.apk |
较老的 32 位设备 |
inkscroll-0.3.6-x86_64.apk |
模拟器 |
analyze 0 issue,测试 73 全通过;已在 Android 13 真机(V2073A)验证导入、封面、去重。