小编mel*_*des的帖子

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

前言

这是关于提高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%的发送是变形的).

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

optimization performance jit smalltalk vm-implementation

8
推荐指数
1
解决办法
360
查看次数

如何将 Smalltalk 中的两个字典与 oneliner 合并?

可能存在特定于方言的方式,或者可能存在通用方式。我有两本字典,让我们说:

a := {'a' -> 1} asDictionary.
b := {'b' -> 2} asDictionary.
Run Code Online (Sandbox Code Playgroud)

现在我想c成为aand的联合b

collections smalltalk

8
推荐指数
2
解决办法
157
查看次数

为什么System V/AMD64 ABI要求16字节堆栈对齐?

我读过的,因为它是为"业绩原因"做不同的地方,但我仍然不知道什么是在性能得到这个16字节对齐提高了特殊情况.或者,无论如何,选择这个的原因是什么.

编辑:我想我以误导的方式写了这个问题.我没有询问为什么处理器使用16字节对齐的内存更快地处理事情,这在文档中随处可见.我想要知道的是,强制执行16字节对齐比仅让程序员在需要时自己对齐堆栈更好.我问这个是因为根据我的汇编经验,堆栈实施有两个问题:只有少于1%的执行代码才有用(所以其他99%实际上是开销); 它也是一个非常常见的错误来源.所以我想知道它最终是如何得到回报的.虽然我对此仍有疑问,但我接受了彼得的回答,因为它包含了我原来问题的最详细答案.

assembly x86-64 abi

5
推荐指数
1
解决办法
1144
查看次数

如何在Smalltalk中复制最多n个集合元素?

是否有优雅的单行内容可以复制集合中的最多n个元素?

我发现编写以下繁琐的内容:

limit := collection size min: n.
copy := collection copyTo: limit
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

编辑 - 还有一个更难的问题:最多复制最后 n个元素

collections smalltalk

4
推荐指数
3
解决办法
161
查看次数

如何在 Roassal 3 中格式化图表?

我按照文档中的示例制作了一个图表。我发现标题和 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)

图表

smalltalk pharo roassal

4
推荐指数
1
解决办法
136
查看次数

螺旋锁所需的最小X86组件是多少

在程序集中实现自旋锁.在这里,我发布了一个我提出的解决方案.这是对的吗?你知道一个较短的吗?

锁:

    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).

x86 assembly spinlock

2
推荐指数
1
解决办法
743
查看次数