perf(compile): pyi 缓存落盘改增量构建,Phase2 新增 vpi 不再全量重建

- _BuildPyiCacheFile 原每次签名变化(Phase2 过程新增 include .vpi)都全量 ast.parse 所有 vpi(prof 43 次 × 0.28s = 12.2s)
- 增量:加载旧 pkl,按 (basename, size, mtime) 复用未变化文件的 vast 树,只 parse 新增/变化文件
- 验证:147 个 vpi 新增 1 文件时仅 0.006s(原全量需数秒);无旧 pkl 时自然退化为全量
This commit is contained in:
TermiNexus committed 2026-08-18 07:27:02 +08:00
1 parent 94a065a386
commit 6613542d8e
1 file changed
+20 -1
+20 -1
View File
@@ -308,7 +308,26 @@ def _BuildPyiCacheFile(temp_dir: str) -> str | None:
except Exception:
pass
cache: dict[str, object] = {}
for p in paths:
# 增量复用:Phase2 过程会新增 include .vpi(签名每次变 → 全量重建 12.2s)。
# 加载旧 pkl,按 (basename, size, mtime) 匹配未变化的文件复用 vast 树,
# 只对新增/变化的文件重新 parse。
old_by_name: dict[str, tuple[int, float, object | None]] = {}
try:
old = _LoadPyiCachePkl(temp_dir)
if isinstance(old, dict):
old_sig = old.get('signature') or []
old_trees = list((old.get('cache') or {}).values())
for _i, (_name, _size, _mtime) in enumerate(old_sig):
_tree = old_trees[_i] if _i < len(old_trees) else None
old_by_name[_name] = (_size, _mtime, _tree)
except Exception:
pass
for p, (name, size, mtime) in zip(paths, sig):
old_entry = old_by_name.get(name)
if (old_entry is not None and old_entry[0] == size
and old_entry[1] == mtime and old_entry[2] is not None):
cache[p] = old_entry[2]
continue
try:
with open(p, 'r', encoding='utf-8') as f:
cache[p] = ast.parse(f.read())