为什么Erlang/BEAM VM中的数学运算速度如此之慢?

为什么Erlang/BEAM VM中的数学运算速度如此之慢?,erlang,beam,Erlang,Beam,我试图理解为什么Erlang中的数学可能如此缓慢,如果是的话,我可以做些什么来找出它的缓慢之处并尝试加速它。有人说这是因为它是一个虚拟机,但我对此表示怀疑,因为JVM和V8在数学方面都很快。其他人说这是因为它是一种不可变的语言,但OCaml是不可变的,而且在数学方面相当快。那么,是什么让Erlang在数学方面变慢了,我该如何在代码中找到它变慢的地方呢?我只能想象使用DTrace,因为我不知道Linux/BSD工具也应该使用,我也不知道哪种工具能够很好地分析VM和VM本身中的代码,以及它们是否需要

我试图理解为什么Erlang中的数学可能如此缓慢,如果是的话,我可以做些什么来找出它的缓慢之处并尝试加速它。有人说这是因为它是一个虚拟机,但我对此表示怀疑,因为JVM和V8在数学方面都很快。其他人说这是因为它是一种不可变的语言,但OCaml是不可变的,而且在数学方面相当快。那么,是什么让Erlang在数学方面变慢了,我该如何在代码中找到它变慢的地方呢?我只能想象使用DTrace,因为我不知道Linux/BSD工具也应该使用,我也不知道哪种工具能够很好地分析VM和VM本身中的代码,以及它们是否需要不同的工具。

在OTP24之前:

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

如果你使用任何直接编译成机器代码的语言,比如C,编译器有更多关于代码和平台的信息,因此能够使用加速操作执行的功能,比如优化处理器的流水线,使用矢量化指令,将访问量最大的变量放入处理器寄存器中,优化内存访问,使它们命中缓存

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

如果编译器还不够,您可以随时在中编写关键的数学操作

此外,你应该检查这个

关于不变性,除非您的整数被放置在大于60位的线程堆上,否则它不会有任何影响,因为这些是唯一需要显式内存处理的整数

为了分析Erlang代码,您必须从内部处理Erlang

最后,你可以把你的代码贴在这里,也许我们可以指出一些东西

OTP24之后:

,有些州的改善率高达25%。

在OTP24之前:

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

如果你使用任何直接编译成机器代码的语言,比如C,编译器有更多关于代码和平台的信息,因此能够使用加速操作执行的功能,比如优化处理器的流水线,使用矢量化指令,将访问量最大的变量放入处理器寄存器中,优化内存访问,使它们命中缓存

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

如果编译器还不够,您可以随时在中编写关键的数学操作

此外,你应该检查这个

关于不变性,除非您的整数被放置在大于60位的线程堆上,否则它不会有任何影响,因为这些是唯一需要显式内存处理的整数

为了分析Erlang代码,您必须从内部处理Erlang

最后,你可以把你的代码贴在这里,也许我们可以指出一些东西

OTP24之后:


,有些州的改善率高达25%。

答案很好,只需补充一下,从OTP24开始,HiPE将消失,JIT将被引入。你可能需要相应地修改你的答案:-@aronisstav我从卢卡斯的某篇文章中知道有什么东西在进行中,但不是因为它太接近了,谢谢!一旦OTP24发布了,我会修改它,以确定一个很好的答案,只是补充说,从OTP24开始,HiPE将消失,JIT将被引入。你可能需要相应地修改你的答案:-@aronisstav我从卢卡斯的某篇文章中知道有什么东西在进行中,但不是因为它太接近了,谢谢!一旦OTP 24确定出来,我会修改这个