TermiNexus
3399b44c2d
perf(tpc): 声明加载去重 + _parse_llvm_type memo(PROF main_prof_72472 前两名热点)
两项改动同在 HandlesImports.py,合并提交:都属"重复重跑"型浪费,且第二项是第一项
放大链的下游。
【一】声明加载按依赖签名去重(类别 a:编译器缺陷)
证据:_TryLoadClassMembersFromPyi 142,888 次 → 6,683 次落到 _EmitExternalClassDeclLlvm
(cum 103.1s)→ _generate_structs 8,059 次(cum 128.7s)→ _TryLoadStructFromStub
88,970 次 → _parse_llvm_type 909,382 次;对照模块声明发射仅 320 次 ⇒ 绝大多数是
同状态的重复发射。
根因:guard 只在"表非空 **且已登记已展平**"时短路,而"父类是泛型特化/始终不可得"
的类永远不会被 `Gen._members_flattened` 登记 ⇒ guard 永不命中 ⇒ 每次重入都重跑整套
`_EmitExternalClassDeclLlvm`(其内部又触发 _generate_structs → _TryLoadStructFromStub
→ 本方法,即每轮 4 帧的环)。
修复:新增 `_ClassMembersReloadSignature`(纯读)收录"重跑能否产生新结果"的全部输入
——全局进度(已登记类数/已展平类数)、本类成员表长度与展平登记、struct body 元素数、
各父类的成员表长度与展平登记;签名不变即直接短路,依赖一变立刻放行(不破坏"与父类/
struct 就绪顺序无关"的设计目标;与 EnsureClassMembersFlattened 的依赖签名同一思路)。
要点:键含 source_sha1(同名类分属不同模块);**先登记再发射**(否则环上第一层重入
还会再发一次,去重被推迟一层);发射抛异常时撤销登记(保住"失败可重试",不让失败态
被签名冻结);force=True 完全绕过。
【二】`_parse_llvm_type` memo + 基础类型表提升为模块常量(类别 b:漏缓存)
证据:该函数被调 1,689,809 次(cum 46.7s),`type_map` 字典每次调用现建 ⇒ 字典字面量
1.69M 次、`IntType.__new__` 9.09M 次;每个 `X*` 还要新建 `ir.PointerType` ⇒ 全程序
`_TypedPointerType.__init__` 4,596,463 次(≈12–15s)主要来自这里。
修复:拆 memo 包装 + `_parse_llvm_type_impl`(原实现逐字搬移,内部递归仍走包装);
memo 只缓存**与 Gen 状态无关**的结果(新增 `_IsGenIndependentLlvmType`:类型图不含
`IdentifiedStructType` 且非 None——含具名结构体的结果绑定 `Gen.structs` 实例且有
泛型特化副作用,None 表示"此刻未加载",二者都不可缓存,理由写进注释防以后被放宽);
`_LLVM_PRIMITIVE_TYPE_MAP` 提升为模块级常量(llvmlite 中这些类型无状态、IntType
按宽度缓存同一实例,跨调用/跨 Gen 共享安全)。
验证:py 层 smoke test 覆盖 16 种类型(含 struct / struct* / [4 x struct] /
{i32,struct} / fn(struct) / fn->struct* 组合),判定全部符合预期,模块可正常 import。
未跑编译器(无 includes 改动,无需重编)。
2026-09-29 16:31:29 +08:00
..
2026-09-29 16:31:29 +08:00
2026-09-29 14:41:48 +08:00
2026-09-28 13:57:04 +08:00
2026-07-18 19:25:40 +08:00
2026-08-17 09:36:38 +08:00
2026-07-18 19:25:40 +08:00
2026-07-18 19:25:40 +08:00
2026-07-18 19:25:40 +08:00
2026-07-18 19:25:40 +08:00
2026-09-29 13:17:36 +08:00
2026-07-30 16:33:56 +08:00
2026-09-26 19:27:22 +08:00
2026-09-26 19:27:22 +08:00
2026-09-28 18:14:45 +08:00
2026-07-18 19:25:40 +08:00
2026-09-26 19:27:22 +08:00
2026-09-28 18:14:45 +08:00
2026-09-28 18:25:57 +08:00
2026-09-29 13:17:36 +08:00
2026-07-18 19:25:40 +08:00
2026-09-29 13:17:36 +08:00
2026-07-18 19:25:40 +08:00
2026-09-29 16:16:01 +08:00