From 7e710d1e9a6f44626af1441035bea269cfcee9d6 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Mon, 17 Aug 2026 20:29:34 +0800 Subject: [PATCH] =?UTF-8?q?perf(vast):=20=5FPeek(0)=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=B8=B8=E6=A0=87=E7=BC=93=E5=AD=98=EF=BC=8C=E5=91=BD=E4=B8=AD?= =?UTF-8?q?=E7=8E=87=2087%=20=E9=99=8D=E4=BD=8E=E8=A7=A3=E6=9E=90=E7=83=AD?= =?UTF-8?q?=E7=82=B9=E5=BC=80=E9=94=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TokenStream._Peek 是 cProfile 最大热点(1588 万次调用,累计 4.86s)。 递归下降解析常在同一游标位置重复窥视(_At/_AtOp/_AtName 等), 增加 _PeekCacheIdx/_PeekCacheTok 字段缓存最近一次 offset=0 结果, 命中时跳过 len() 与列表索引;游标移动后 Idx 失配自然失效。 实测大文件解析命中率 87.1%(6503 次调用仅 717 次真实访问), vast 差分测试 51/53 通过、0 FAIL,正确性无回归。 --- lib/vast/ExprParser.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/vast/ExprParser.py b/lib/vast/ExprParser.py index c55b0e7..b78282c 100644 --- a/lib/vast/ExprParser.py +++ b/lib/vast/ExprParser.py @@ -46,6 +46,11 @@ class TokenStream: self.Source: str = source self.LineStarts: list[int] = line_starts self.Idx: int = 0 + # _Peek(0) 缓存:递归下降解析常在同一游标位置重复窥视 + # (_At/_AtOp/_AtName 等),命中时跳过 len() 与列表索引。 + # 游标移动后 Idx 变化自然失配,无需显式失效。 + self._PeekCacheIdx: int = -1 + self._PeekCacheTok: Token | None = None # ------------------------------------------------------------------ # 游标操作 @@ -54,6 +59,12 @@ class TokenStream: i: int = self.Idx + offset if i >= len(self.Tokens): return self.Tokens[-1] + if offset == 0: + if self._PeekCacheIdx == i: + return self._PeekCacheTok + self._PeekCacheIdx = i + self._PeekCacheTok = self.Tokens[i] + return self._PeekCacheTok return self.Tokens[i] def _Next(self) -> Token: