# 磁盘缓存留存 A/B(2026-10-14) 对照的是本分支的父提交 `66cd60081f37a57680274633fcb3fb942d01bb2f`(建分支时的 `origin/staging`)。任务书里写的 `77057a819` 已经不是当前测试线头。A 用 `git show` 把父提交的接口文件载入同一进程,并把它的仓库路径指回本工作树,否则临时副本找不到引擎。B 是本分支。 演练用虚构盘,不写真实出生资料。文件都在系统临时目录,不写工作树里的 `scratch/`。 主测量挡住了 `jhora` 和 `vedastro` 的导入。本机装了 VedAstro SDK,并且能连上官方端口;另有一组不挡 SDK、但仍关闭外网取数,见文末。 ## 命令 ```powershell .venv\Scripts\python.exe scripts\research\api_chart_cache_byte_diff.py .venv\Scripts\python.exe scripts\research\api_disk_cache_ab.py .venv\Scripts\python.exe scripts\research\api_disk_cache_ab.py --with-sdk --sdk-probe ``` ## 命中率 20 张虚构盘 × 3 种写法 × 快速/完整 × 7 天 × 每种重复 3 次 = 2520 次取键。取键用的是真实缓存键函数,没有把 2520 次都做成完整排盘。 | | 改前 A | 改后 B | 变化 | | --- | --- | --- | --- | | 不同缓存键 | 840 | 280 | 少 560 | | 命中次数 | 1680 | 2240 | 多 560 | | 命中率 | 0.6667 | 0.8889 | B / A = 1.333 | 目标是混合写法下 B 至少为 A 的 2.5 倍。按任务书规定的「重复 3 次」算,没有达到:A 自己靠重复就已经有三分之二命中,写法合并只能再抬到约 89%。若不算这 3 次重复、只看三种写法各问一次,A 的命中率是 0,B 是 0.6667。目标数字不改。 ## 七天后的文件 留存演练写的是短记录,用来数文件,不是完整盘面。期限 900 秒,只有当天的键还没过期。 | | 改前 A | 改后 B | | --- | --- | --- | | 清理前文件数 | 840 | 280 | | 清理前字节 | 109200 | 36400 | | 清理后文件数 | 840(旧代码没有这份清理) | 40 | | 当天仍有效的键 | 120 | 40 | B 清理后的文件数等于当天有效键数,达到「不超过当天活跃键」的目标。 审计文件:B 在默认关闭时写出 0 个。达到目标。 负缓存:种入当天和前一天各一份,清理后剩 1 份(当天)。达到目标。 ## 清理耗时 | 场景 | 结果 | | --- | --- | | 预置 10000 个已过期排盘缓存后,整次清理 | 20.174 秒,排盘目录 20170.902 毫秒,删掉 10000,剩下 0 | | 上面七天演练里的排盘目录 | 370.161 毫秒 | 目标是 10000 个文件在 2 秒内、且不在请求线程。本次在后台函数里测,不在请求线程;耗时没有进 2 秒。这是 Windows 上逐个读文件再删除的实测,目标不改。默认清理间隔仍是 1800 秒,失败快照短期限仍是 300 秒,不因为这次没进 2 秒就改默认值。 ## 排盘耗时(一次虚构盘,快速排盘,外网关闭) | | 中位数 | | --- | --- | | 未命中 3 次 | 23.036 毫秒 | | 命中 3 次 | 5.249 毫秒 | ## 响应是否还是同一张盘 数值等价的写法(小时 12 / 12.0 / "12",纬度数字和字符串,时区 5.5 和 "5.5",秒缺省和 0)在快速排盘下去掉 `runtime_cache` 后逐字节相同。完整排盘只差官方快照缓存上的写入时刻和到期时刻,盘面没有别的差异。父提交和本分支对同一张快速排盘、去掉 `runtime_cache` 后逐字节相同。因此这些字段可以合并进同一把缓存键。 不挡 SDK 的一组:本机有 VedAstro SDK,官方端口能连通。探针仍关闭外网取数。一次完整排盘 4.167 秒,没有报错。没有拉取真实快照。