iOS 14 Objective-C Runtime内存优化——IMP缓存预计算

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

objc_msgSend实现: