对象属性别直接用哈希表:shape 让 a.b 变快
来源:bernsteinbear.com — 2026-10-21
📋 概述
动态语言的实例常被实现成名字到值的哈希表,但 a.b 这种最常见的操作就要哈希、探测和一次额外的内存跳转,实际可能花掉上千条 CPU 指令。运行时于是引入 map、layout、shape、hidden class 这套东西:用小的整数索引代替字符串哈希、把属性内联存在对象上、并给每种布局一个可比较的稳定标识。作者照 CF Bolz-Tereick 的对象模型文章抽出一份能在脑子里装下的最小实现。
🔑 核心要点
- 哈希表方案的问题在于每次 a.b 都要哈希、探测、再多一次内存跳转
- shape 的三个目标:快路径只处理小整数、属性内联存储、布局有稳定标识
- 属性内联在对象上,可以省掉一次可能 cache miss 的间接访问
- 作者刻意只保留 500 行以内的骨架,跳过类与方法的复杂部分,专攻属性与 map
- map 相当于对象布局的索引或写穿缓存,能回答「有哪些属性」「属性 a 偏移多少」这类问题
💡 金句
This means that literally every operation a.b is doing hundreds or thousands of CPU instructions, including multiple dependent memory loads.
👍 0
👎 0
← 返回 Lobsters 首页