为什么Erlang/BEAMVM中的数学运算如此缓慢?

我试图理解为什么 Erlang 中的数学可能会这么慢,如果是这样,我可以做些什么来找出它慢的地方并尝试加快速度。有人说这是因为它是一个 VM,但我对此表示怀疑,因为 JVM 的数学运算速度很快,V8 也是如此。其他人说这是因为它是一门不可变的语言,但 OCaml 是不可变的,并且在数学上非常快。那么是什么让 Erlang 在数学上变慢了,我将如何找到代码中它变慢的地方?我只能想象使用 DTrace,因为我不太了解我应该使用的 Linux/BSD 工具,而且我不知道哪些工具擅长分析 VM 中的代码和 VM 本身,以及这些需要不同的工具。

回答

在 OTP24 之前:

BEAM 没有 JIT,所以通常 erlang 编译器 ( erlc) 输出字节码:任何数学运算都需要访问 VM 寄存器(它们是内存位置),执行实际操作,将结果放在相关的 VM 寄存器中,然后跳转到下一条指令。与仅在机器代码中执行实际操作相比,这相当慢。

如果您使用任何直接编译为机器代码的语言(如 C),编译器将拥有更多关于代码和平台的信息,因此能够使用加速操作执行的功能,例如优化处理器的管道,使用矢量化指令,将最常访问的变量放在处理器的寄存器中,优化内存访问,以便它们访问缓存......

该HIPE编译器是有编译二郎代码本地人,如果你的程序使用了大量的数学,你应该使用它。不过,请务必检查其局限性。

如果HiPE编译器不够用,您始终可以用C编写关键的数学运算并将其包含在内。

此外,您应该通过比较 Erlang 和 C(以及其他)的纯数学问题来检查这个问题

关于不变性,除非将整数放在线程的堆(> 60 位)上,否则它不会产生任何影响,因为只有那些需要显式内存处理。

为了分析 Erlang 代码,您可以使用这些工具从内部处理 Erlang。

最后,您可以随时在此处发布您的代码片段,也许我们可以指出一些内容。

OTP24 之后:

Erlang 现在有 JIT,一些报告指出提高了 25%。


以上是为什么Erlang/BEAMVM中的数学运算如此缓慢?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>