Performance 让megamorphic呼叫站点更高效的不同技术有哪些
序言 这是关于提高JIT编译器中的消息发送效率。尽管提到Smalltalk,但这个问题适用于大多数动态JIT编译语言 问题 给定一个消息发送站点,它可以分为单态、多态或巨态。如果消息发送的接收者总是同一类型,则它是单态发送,如中所示Performance 让megamorphic呼叫站点更高效的不同技术有哪些,performance,optimization,smalltalk,jit,vm-implementation,Performance,Optimization,Smalltalk,Jit,Vm Implementation,序言 这是关于提高JIT编译器中的消息发送效率。尽管提到Smalltalk,但这个问题适用于大多数动态JIT编译语言 问题 给定一个消息发送站点,它可以分为单态、多态或巨态。如果消息发送的接收者总是同一类型,则它是单态发送,如中所示 10 timesRepeat: [Object new]. 其中,new的接收者始终是对象。对于这种类型的发送,JIT发出单态内联缓存 有时,给定的发送站点引用几种不同的对象类型,如: #(1 'a string' 1.5) do: [:element | ele
10 timesRepeat: [Object new].
其中,new
的接收者始终是对象
。对于这种类型的发送,JIT发出单态内联缓存
有时,给定的发送站点引用几种不同的对象类型,如:
#(1 'a string' 1.5) do: [:element | element print]
在这种情况下,print
被发送到不同类型的对象。对于这些情况,JIT通常会发出多态内联缓存
当一条消息被发送到同一个地方的多个不同的对象类型而不仅仅是少数对象类型时,就会发生Megamorphic消息发送。最突出的例子之一是:
Behavior>>#new
^self basicNew initialize
这里,basicNew
创建对象,然后initialize
进行初始化。你可以做:
Object new
OrderedCollection new
Dictionary new
它们都将执行相同的行为>>#新方法。由于initialize的实现在很多类中是不同的,PIC将很快填充。我对这种发送站点很感兴趣,因为我知道它们只会很少出现(只有1%的发送是巨型的)
问题
为了避免查找,megamorphic发送站点有哪些可能的和特定的优化
我想象了一些,想知道更多。PIC满后,我们必须调用查找(已满或全局缓存),但要优化,我们可以:
- 回收图片,扔掉所有条目(许多条目可能是旧的,不经常使用)
- 调用某种特定的巨形查找(即,将所有以前调度的类型缓存在由类型哈希访问的数组中的查找)
- 内联包含方法(内联后,发送站点可能不再是超级站点)