- 方案:为参与IMP缓存预计算的(SEL, IMP)键值对建一个完美哈希表(perfect hashtable),这样既能省内存,性能又优于之前的线性探测法
- 困难:文献中的完美哈希函数都比较复杂
- 手段:算法控制selector的取值,使之能够被完美哈希
- 具体实现:
- 哈希函数:
((sel - @selector(anchor_sel)) >> $shift & $mask- 其中anchor_sel是本class的cache中的第一个selector
$shift和$mask是本class的cache采用的hash函数参数
- 通过一个放置算法控制selector实际存放的地址,使selector的某些特定的位取特定的值
- 哪些位取什么值与class相关
- 对方法列表(method list)也做了跟cache类似的优化,使cache中可以不使用指针而改用32-bit的偏移对
- 只对常用的叶子类预计算cache,其他类使用原来的动态cache逻辑
- 哈希函数:
- 收益:
- IMP cache所占的内存大量减少
- 因为是完美哈希,占满率为100%,占用内存大大少于动态cache
- 启动速度也大幅提升
- 无需动态建立 IMP cache
- 对OC runtime锁的竞争减少
- IMP cache所占的内存大量减少
objc_msgSend实现:
