使变形调用站点更有效的不同技术有哪些

时间:2015-03-12 22:20:18

标签: performance optimization smalltalk jit vm-implementation

序言

这是关于提高JIT编译器中的消息发送效率。尽管提到了Smalltalk,但这个问题适用于大多数动态JIT编译语言。

问题

给定一个消息发送站点,它可以被分类为单态多态 megamorphic 。如果发送的消息的接收者总是相同类型,则它是单态发送,如

10 timesRepeat: [Object new].

new的接收方始终为Object。对于这种发送,JIT会发出单态内联缓存。

有时,给定的发送站点会引用一些不同的对象类型,例如:

#(1 'a string' 1.5) do: [:element | element print]

在这种情况下,print被发送到不同类型的对象。对于这些情况,JIT通常会发出多态内联缓存。

当消息不仅仅发送到同一个地方的不同对象类型的很多时,就会发生变形消息发送。其中一个最突出的例子是:

Behavior>>#new
    ^self basicNew initialize

在这里,basicNew创建对象,然后initialize进行初始化。你可以这样做:

Object new
OrderedCollection new
Dictionary new

并且它们都将执行相同的行为>> #new方法。由于初始化的实现在很多类中是不同的,因此PIC将很快填充。 我对这种发送网站感兴趣,知道它们只是不经常发生(只有1%的发送是变形的)。

问题

  

对于变形发送站点有哪些可能的和特定的优化以避免进行查找?

1 个答案:

答案 0 :(得分:3)

我想象一下,想了解更多。 PIC完成后,我们必须调用查找(完整或全局缓存),但要优化我们可以:

  • 回收PIC,丢弃所有条目(许多条目可能很旧而且不经常使用)。
  • 调用某种特定的变形查找(即可以缓存由类型哈希接收的数组中所有先前调度的类型)。
  • 内联包含方法(内联时,发送网站可能会停止变形)