From 6613542d8e97b4230785338087e08a7bf848d998 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Tue, 18 Aug 2026 07:27:02 +0800 Subject: [PATCH] =?UTF-8?q?perf(compile):=20pyi=20=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E8=90=BD=E7=9B=98=E6=94=B9=E5=A2=9E=E9=87=8F=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=EF=BC=8CPhase2=20=E6=96=B0=E5=A2=9E=20vpi=20=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E5=85=A8=E9=87=8F=E9=87=8D=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - _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 时自然退化为全量 --- lib/Projectrans/Phase2Translator.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/Projectrans/Phase2Translator.py b/lib/Projectrans/Phase2Translator.py index 87a1be5..983a453 100644 --- a/lib/Projectrans/Phase2Translator.py +++ b/lib/Projectrans/Phase2Translator.py @@ -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())