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:
1 parent
c2b04f5026
commit
e25095da43
2 files changed
+14
-3
No files matched your search
+12
-1
@@ -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
@@ -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
|
||||
|
||||
Reference in new issue
Block a user