2

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

4

1 回答 1

6

OTP24 之前:

BEAM 没有 JIT,所以通常 erlang 编译器erlc(下一条指令。与仅在机器代码中执行实际操作相比,这非常慢。

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

HiPE编译器用于将 erlang 代码编译为本机代码,如果您的程序使用大量数学运算,您应该使用它。不过,一定要检查它的局限性

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

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

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

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

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

OTP24 之后:

Erlang 现在有 JIT,一些报告说改进了 25%。

于 2020-12-16T19:50:07.170 回答