前言
这是关于提高JIT编译器中的消息发送效率.尽管提到了Smalltalk,但这个问题适用于大多数动态JIT编译语言.
问题
给定一个消息发送站点,它可以被分类为单态,多态或变形.如果发送的消息的接收者总是相同类型,则它是单态发送,如
10 timesRepeat: [Object new].
Run Code Online (Sandbox Code Playgroud)
new总是接收者的地方Object.对于这种发送,JIT发出单态内联缓存.
有时,给定的发送站点会引用一些不同的对象类型,例如:
#(1 'a string' 1.5) do: [:element | element print]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,print被发送到不同类型的对象.对于这些情况,JIT通常会发出多态内联缓存.
当消息不仅仅发送到同一个地方的许多不同对象类型时,就会发生变形消息发送.其中一个最突出的例子是:
Behavior>>#new
^self basicNew initialize
Run Code Online (Sandbox Code Playgroud)
在这里,basicNew创建对象,然后进行initialize初始化.你可以这样做:
Object new
OrderedCollection new
Dictionary new
Run Code Online (Sandbox Code Playgroud)
并且它们都将执行相同的行为>> #new方法.由于初始化的实现在很多类中是不同的,因此PIC将很快填充.我对这种发送网站感兴趣,知道它们只是不经常发生(只有1%的发送是变形的).
题
对于变形发送站点有哪些可能的和特定的优化来避免进行查找?
可能存在特定于方言的方式,或者可能存在通用方式。我有两本字典,让我们说:
a := {'a' -> 1} asDictionary.
b := {'b' -> 2} asDictionary.
Run Code Online (Sandbox Code Playgroud)
现在我想c成为aand的联合b。
我读过的,因为它是为"业绩原因"做不同的地方,但我仍然不知道什么是在性能得到这个16字节对齐提高了特殊情况.或者,无论如何,选择这个的原因是什么.
编辑:我想我以误导的方式写了这个问题.我没有询问为什么处理器使用16字节对齐的内存更快地处理事情,这在文档中随处可见.我想要知道的是,强制执行16字节对齐比仅让程序员在需要时自己对齐堆栈更好.我问这个是因为根据我的汇编经验,堆栈实施有两个问题:只有少于1%的执行代码才有用(所以其他99%实际上是开销); 它也是一个非常常见的错误来源.所以我想知道它最终是如何得到回报的.虽然我对此仍有疑问,但我接受了彼得的回答,因为它包含了我原来问题的最详细答案.
是否有优雅的单行内容可以复制集合中的最多n个元素?
我发现编写以下繁琐的内容:
limit := collection size min: n.
copy := collection copyTo: limit
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?
编辑 - 还有一个更难的问题:最多复制最后 n个元素
我按照文档中的示例制作了一个图表。我发现标题和 x/y 标签离绘图本身太近,刻度标签太小。我如何格式化它们?
x := -3.14 to: 3.14 count: 100.
y := x sin.
c := RSChart new.
p := RSLinePlot new x: x y: y.
c addPlot: p.
c title: 'Sine function'.
c xlabel: 'X axis'.
c ylabel: 'Y axis'.
c addDecoration: RSHorizontalTick new.
c addDecoration: RSVerticalTick new.
c open
Run Code Online (Sandbox Code Playgroud)
在程序集中实现自旋锁.在这里,我发布了一个我提出的解决方案.这是对的吗?你知道一个较短的吗?
锁:
mov ecx, 0
.loop:
xchg [eax], ecx
cmp ecx, 0
je .loop
Run Code Online (Sandbox Code Playgroud)
发布:
lock dec dword [eax]
Run Code Online (Sandbox Code Playgroud)
eax初始化为-1(这意味着锁是免费的).这适用于许多线程(不一定是2).
smalltalk ×4
assembly ×2
collections ×2
abi ×1
jit ×1
optimization ×1
performance ×1
pharo ×1
roassal ×1
spinlock ×1
x86 ×1
x86-64 ×1