perf(vast): _At 内联 _Peek(0) 缓存逻辑 + Node 构造 __dict__ 直写

_At 被调用 1384 万次,每次经 _Peek 再取 token;内联 _Peek(0) 缓存
(_PeekCacheIdx/_PeekCacheTok)省 2300 万次函数调用,实测单文件解析
端到端提速 ~37%。_Init 的 setattr 改 __dict__ 直写(AST 节点无
__slots__/property,行为等价)。vast 差分测试 51/53 PASS 0 FAIL。
This commit is contained in:
TermiNexus committed 2026-08-17 22:20:28 +08:00
1 parent c2b04f5026
commit e25095da43
2 files changed
+14 -3

No files matched your search

+12 -1
View File
@@ -77,7 +77,18 @@ class TokenStream:
return self.Tokens[max(0, self.Idx - 1)]
def _At(self, tok_type: str, value: str | None = None) -> bool:
tok: Token = self._Peek()
# 内联 _Peek(0) 缓存逻辑(行为与 _Peek(offset=0) 完全一致):
# 命中缓存直接取 _PeekCacheTok,miss 时读 Tokens[i] 并更新缓存;
# i >= len(Tokens) 时取末尾哨兵 token(不更新缓存)。
i: int = self.Idx
if i >= len(self.Tokens):
tok: Token = self.Tokens[-1]
elif self._PeekCacheIdx == i:
tok = self._PeekCacheTok
else:
self._PeekCacheIdx = i
self._PeekCacheTok = self.Tokens[i]
tok = self._PeekCacheTok
if tok.Type != tok_type:
return False
if value is not None and tok.Value != value:
+2 -2
View File
@@ -310,9 +310,9 @@ def _MakeNodeClass(name: str, fields: tuple[str, ...], attrs: tuple[str, ...]) -
f'{name} constructor takes at most {len(fields)} positional arguments'
)
for fname, val in zip(fields, args):
setattr(self, fname, val)
self.__dict__[fname] = val
for k, v in kwargs.items():
setattr(self, k, v)
self.__dict__[k] = v
base_name: str | None = _BASE_CLASS.get(name)
base_cls: type = globals()[base_name] if base_name else AST