perf(全仓库/正则): 字面量正则全部改模块级预编译常量(15 文件 / 115 个调用点)
背景(prof 基线 PROF/20260930_224857,主进程 433.69s):正则这一族合计 ≈45s —— `re.match`(未预编译入口)被调 1970 万次 / 自身 10.70s、它内部 `Pattern.match` 占 8.06s, `re._compile`(缓存查找)1975 万次 / 7.19s,`re._make`(真正编译)274 万次 / 7.62s (说明 re 的 512 条缓存已被打穿,每 7 次调用就有 1 次重新编译)。 每次 `re.match(字面量, s)` 都要做"模式串哈希 → 缓存查找";预编译后这层全省掉。 改动:把 15 个文件里 97 处"字面量当模式"的 `re.match/search/sub/subn/fullmatch/ findall/finditer/split(...)` 提升为模块级 `_RE_*: re.Pattern[str] = re.compile(...)`, 共 115 个调用点(含同字面量跨处共用)。模式串与 flags 一字未改(flags 从调用处 搬进 re.compile,含原先以**位置参数**传入的 flags)。4 处拼接型动态模式按设计不动 (FuncGen 2 处、HandlesImports 2 处)。 核验(不靠肉眼):写了 AST 指纹对拍脚本,对每个文件取 HEAD 版与新工作区版,把 "旧 re.<m>(字面量, 其余实参, 关键字) + flags" 与 "新 _RE_X.<m>(实参, 关键字) + 常量 (模式, flags)" 做多重集比对 —— 15 个文件、115 个调用点全部逐一等价(0 失败), 另查无重名常量、无遗留字面量调用、GetDiagnostics 全空。 对拍过程中查出一处子代理抄写错误:`_RE_GLOBAL_DSOLOCAL_MULTILINE` 丢了行首锚 `^` (原文注释明确"使用 ^ + MULTILINE 避免匹配字符串常量内容中的 define/declare"),已修正。 同轮经查证后**未做改动**的两项(避免把假热点当真事修): - VLogger 的 `re.sub` 6.43s:profile 当时的 VLogger 版本里根本没有 `import re` (`git show 3658ab06:lib/core/VLogger.py` 已确认),属 C 帧错挂,不做。 - tokenize 274 万次:那是 `_generate_tokens_from_c_tokenizer` 的 **token 产出次数** (≈350 个整文件的词法量),SymbolUtils 的 4 个 tokenize 调用点 nc 仅数百,且已有 `_EXPAND_CACHE` 去重;再加一层 token 缓存无收益,不做。
This commit is contained in:
1 parent
4641777db1
commit
b18d57fa38
15 files changed
+318
-96
No files matched your search
@@ -11,9 +11,14 @@ from lib.includes.t import CTypeRegistry
|
||||
from lib.core.SymbolUtils import (
|
||||
IsListAnnotation, AnnotationContainsName, IsCPtrSubscriptNode, IsCPtrNode,
|
||||
IsRawPtrSubscriptNode, IsPtrSubscriptNode, ResolveGenericTypeArgStr,
|
||||
EnumClassIntWidth, ClassHasFuncLevelCVTable)
|
||||
|
||||
|
||||
EnumClassIntWidth, ClassHasFuncLevelCVTable)
|
||||
|
||||
# 泛型特化(`_SubstituteTypeArgs`)把 `%"SHA1.T"` / `%"SHA1.T"*` 替换为 i8* 用的
|
||||
# **预编译**正则(性能:字面量正则预编译避免 re 缓存查找与编译开销)。
|
||||
_RE_T_TYPE_PTR: re.Pattern[str] = re.compile(r'%"[a-f0-9]+\.T"\*')
|
||||
_RE_T_TYPE: re.Pattern[str] = re.compile(r'%"[a-f0-9]+\.T"')
|
||||
|
||||
|
||||
class DeclarationGenerator:
|
||||
"""从 .pyi AST 生成纯 LLVM IR 声明(不使用字符串操作)"""
|
||||
|
||||
@@ -1060,9 +1065,9 @@ class DeclarationGenerator:
|
||||
for mt in member_types:
|
||||
new_mt: str = mt
|
||||
# 将 %"SHA1.T"* 替换为 i8*(不透明指针)
|
||||
new_mt = re.sub(r'%"[a-f0-9]+\.T"\*', 'i8*', new_mt)
|
||||
new_mt = _RE_T_TYPE_PTR.sub('i8*', new_mt)
|
||||
# 将 %"SHA1.T"(非指针,如 embedded struct)替换为 i8*
|
||||
new_mt = re.sub(r'%"[a-f0-9]+\.T"', 'i8*', new_mt)
|
||||
new_mt = _RE_T_TYPE.sub('i8*', new_mt)
|
||||
result.append(new_mt)
|
||||
return result
|
||||
|
||||
|
||||
Reference in new issue
Block a user