Search: #JIT编译优化

  1. 《对象、属性、Map,天哪!——动态语言的对象形状(Object Shapes)解析》

    《对象、属性、Map,天哪!——动态语言的对象形状(Object Shapes)解析》

    标签:
    #编程语言实现 #虚拟机优化
    #对象形状 #HiddenClass #内联缓存 #动态类型语言 #JIT编译优化 #内存布局

    总结:
    这篇博文讲解了动态类型语言(Python、Ruby、JavaScript 等)运行时如何用“对象形状”(maps / hidden classes)替代朴素的“哈希表存属性”模型。作者基于 CF Bolz-Tereick 的极简对象模型,用不足一页的 Python 代码完整实现了形状树、内联缓存(inline cache)的核心逻辑,并延伸到存储策略、类型冻结、类版本化等进阶优化,最后用 C++ 草绘了 V8、JSC、Skybison 等真实运行时的内存布局。

    文章要点:
    1. 朴素模型用哈希表存对象属性:虽然概念上是 O(1),但每次属性访问都要做字符串哈希、探测和一次额外的间接内存跳转,热路径上可能耗费成百上千条 CPU 指令。
    2. 形状(map/hidden class)同时解决三个问题:把字符串查找换成小整数偏移、让属性内联存储在对象内部消除间接跳转、作为不可变的稳定标识供快速比对——属性一旦变化就沿形状树换到新 map,旧 map 永不修改。
    3. 形状是持久化数据结构(树/字典树):所有空对象共享同一个空 map,按相同顺序加属性则共享同一形状;加属性顺序不同(如 a 后 b vs 反过来,或条件分支里赋值)会产生不同形状,这是实践中缓存命中率下降的常见原因。
    4. 内联缓存的工作方式:缓存“期望 map + 属性偏移”的组合,用指针相等(is)做极快校验,命中则直接按偏移加载;未命中走字符串慢路径并回填缓存——真机实现中快速路径内联、慢速路径外联,JIT 编译器还会进一步消除这层“解释态”。
    5. 形状与类是两个概念:不同类的对象可以有相同形状,这让内联缓存保持单态(monomorphic)、命中率更高;但也意味着形状不能作为类的代理(如 Ruby attr_reader 需要“类查方法 + 形状查偏移”两段式查找)。
    6. 进阶方向包括:给 map 附带类型信息(类型冻结,记录“该属性永远是 float”以减少守卫)、按存储策略单态化集合(空列表、小整数列表等专用布局)、类版本化,以及给真实运行时预留“溢出槽”处理对象估不准的大小。
    7. 实用启示:大多数对象字段很少(<20 个),Ruby 等运行时会在对象过大时退回哈希表模式;性能回归中缓存命中与未命中在热路径上可能有 2 倍以上的差距,Rails 等项目已有通过保持形状单态来优化 JIT 的实战 PR。

    URL:https://bernsteinbear.com/blog/object-shapes/

  2. 《Python 3.15的JIT编译器重回正轨》

    《Python 3.15的JIT编译器重回正轨》

    标签:#Python #JIT #CPython #性能优化 #Faster_CPython #编译器 #开源社区

    总结:

    Python 3.15的JIT编译器开发取得突破性进展,在失去主要赞助商后通过社区协作成功实现性能目标。目前macOS AArch64平台比解释器快11-12%,Linux x86_64快5-6%,提前完成预定目标。文章强调了团队建设、任务分解和幸运的技术决策(如追踪记录解释器和引用计数消除)对项目成功的关键作用。

    文章要点:

    - **性能目标提前达成**:Python 3.15的JIT在macOS AArch64上比尾调用解释器快11-12%,在Linux x86_64上比标准解释器快5-6%,提前一年多完成目标
    - **从困境中重生**:Faster CPython团队2025年失去主要赞助商后,通过社区托管模式维持开发,作者曾怀疑JIT项目能否成功
    - **降低"巴士因子"风险**:团队计划在JIT的前端(区域选择器)、中端(优化器)、后端(代码生成器)各配备2名活跃维护者,目前中端已有4名贡献者
    - **任务分解吸引新人**:将复杂优化问题拆分为简单任务(如"优化单条指令"),提供详细可操作的指导,让无JIT经验的C程序员也能参与,共11人参与核心重构
    - **关键技术决策**:Brandt建议改用追踪式前端,Mark建议双分派表机制,意外地将追踪解释器性能从慢6%提升到快1.x%,并将JIT代码覆盖率提升50%
    - **引用计数消除优化**:消除每条Python指令的分支操作,这一优化易于并行化且适合教学,是3.15版本的主要优化方向
    - **基础设施支撑**:Savannah Ostrowski一人搭建了等效于整个基础设施团队的CI系统,每日性能测试帮助快速发现回归问题

    文章URL:

    https://fidget-spinner.github.io/posts/jit-on-track.html