作者:书生 | 来源:互联网 | 2023-09-02 13:14
我试图理解为什么Erlang中的数学可能会这么慢,如果是这样,我可以做些什么来找出它慢的地方并尝试加快速度。有人说这是因为它是一个VM,但我对此表示怀疑,因为JVM的数学运算速度
我试图理解为什么 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%。