Skip to content

Latest commit

 

History

History
71 lines (49 loc) · 4.8 KB

File metadata and controls

71 lines (49 loc) · 4.8 KB

图库性能优化记录

2026-09-10,arm64 Mac / macOS 26.6.2。本次针对原生后端的图库响应与缓存写入开销,未改变 FIT 显示算法。

改动

  • 图库扫描完成时单独保存不带 SUB 明细的摘要。首页命中缓存时只复制摘要,不再复制、计算评分并丢弃全库的 SUB 明细。
  • 单个目标的 SUB 接口只取该目标的明细,再应用当前评分和标签。后台 R2 仍可取得完整数据。
  • 缓存写入在事务中增量维护记录数与占用,超过 2 GiB 才按访问时间淘汰旧记录;不再每写一条记录就执行全表窗口聚合。用 SQLite data_version 检测其他 App/CLI 连接的提交,变化后重新统计,保留旧缓存表格式。
  • 复用设备名称解析的正则表达式,减少逐文件构造开销。

图库仍按原有 20 秒有效期和手动刷新规则扫描;SUB 日期、设备、滤镜和文件统计保持完整。后台预览缓存建立仍跳过 SUB,打开 SUB 图片时按需解析。没有以放宽缓存容量限制、减少图库内容或延长数据过期时间换取速度。

合成图库对照

20 个目标、60 张成片、6,000 张 SUB。每个版本使用独立临时图库和空应用缓存,文件页由写入测试文件预热;这是软件开销测试,不是机械硬盘冷读测试。首次扫描和强制重扫各测一次,命中缓存的接口取 9 次中位数,并发请求为同时发起 8 次。

测量 优化前 优化后
空应用缓存首次图库扫描 7,237.16 ms 1,163.23 ms
头信息已有缓存时强制重扫 379.88 ms 370.18 ms
图库缓存命中 13.68 ms 0.54 ms
单目标 SUB 详情(300 帧) 14.24 ms 1.23 ms
缓存状态读取 0.38 ms 0.21 ms
8 个并发图库请求的中位数 54.71 ms 1.65 ms
并发请求后进程常驻内存快照 88,464 KiB 61,312 KiB

返回内容仍包含 60 张成片、6,000 张 SUB 的完整分组统计,首页响应均为 40,517 字节。内存数据是同一阶段的快照,不是峰值测量。

真实图库与 FIT 预览

对现有 9,219 个文件(其中 SUB 9,108 个)的图库,只读取 API,未清空用户缓存或改动照片。图库缓存命中请求由 22.84 / 22.59 ms 降至 1.35 / 1.30 / 1.11 / 1.00 ms,约从 23 ms 降至 1.2 ms。一次重扫样本为 632.48 → 563.22 ms;此路径仍需要访问磁盘和文件元数据,不应套用缓存命中请求的加速比。

另交替运行优化前后各 5 轮独立的 1920×1080 RGB float32 合成 FIT 测试,排除单次计时波动。每轮 CLI 渲染取 3 次中位数,最终再取 5 轮中位数:

测量 优化前 优化后
CLI 渲染,含启动和 PNG 写盘 16.77 ms 16.72 ms
空应用缓存首次 HTTP 预览 107.53 ms 107.30 ms
内存命中 HTTP 预览 0.26 ms 0.28 ms

预览性能基本持平,本次收益主要在图库和大量缓存记录的维护。当前 App 已显示 34 个目标;页面搜索、M 31 的 SUB 分组及图片预览通过实际界面检查。

复测与正确性

./script/build_native.sh
python3 tests/benchmark_library.py
python3 tests/benchmark_native.py
python3 -m unittest discover -s tests -v
node tests/test_gallery.cjs

图库基准可传 --binary /path/to/astrolibrary 对比另一个自行保留的构建,也可用 --frames 12000 改变 SUB 规模。历史对照程序和临时测量文件已清理;原始汇总数据与两个构建的 SHA-256 保留在 library-performance.json。当前脚本仍可复测当前版本,复现历史版本间对比则需要对应源码或二进制。

上述结果是该日期的历史测量,不代表当前机器的实测值。回归覆盖包含跨连接缓存统计、同键替换、容量淘汰、清空和目标详情评分一致性;当前测试与打包检查入口见 开发文档

Python 到 C++ 的历史渲染对照

同为 2026-09-10、arm64 Mac / macOS 26.6.2,使用 1920×1080 RGB float32 合成 FIT(24,886,080 字节),输出 960×540 预览。预热系统文件页后取 3 次中位数;C++ 包含进程启动和 PNG 写盘,Python 是进程内调用。

测量 耗时
Python 解码、显示和 PNG 915.07 ms
C++ 解码、显示和 PNG,含启动/写盘 15.91 ms
C++ FIT 解码阶段 4.07 ms
原生 HTTP 首次预览,App 缓存为空 100.79 ms
原生 HTTP 内存命中,10 次中位数 0.25 ms

该合成样本的渲染约快 57.5 倍,输出像素一致;它不是机械硬盘冷读或整库扫描的加速比。原始结果见 native-benchmark.json。旧业务实现已移除,tests/benchmark_native.py 只复测当前 C++ 渲染/缓存及 CLI/HTTP 输出一致性,不重新计算 Python 对照。