我试图理解为什么Erlang中的数学可能如此缓慢,如果是这样,我可以做些什么来找出它的缓慢之处并尝试加快它。有些人说这是因为它是一个虚拟机,但我对此表示怀疑,因为JVM的数学速度很快,V8也是如此。其他人说这是因为它是一种不可变的语言,但OCaml是不可变的,而且数学速度很快。那么,是什么让Erlang的数学速度慢呢?我该如何在代码中找到它的速度慢的地方呢?我只能想象使用DTrace,因为我不太了解应该使用的Linux/BSD工具,也不知道哪些工具会擅长分析VM和VM本身中的代码,以及这些工具是否需要不同的工具。
OTP24:之前
BEAM没有JIT,因此通常erlang编译器(erlc
(输出字节码:任何数学运算都需要访问VM寄存器(即内存位置(,执行实际运算,将结果放入相关的VM寄存器,然后跳到下一条指令。与仅在机器代码中执行实际操作相比,这相当缓慢。
如果您使用任何直接编译为机器代码的语言(如C(,编译器会有更多关于代码和平台的信息,因此能够使用加快操作执行的功能,如优化处理器的管道、使用矢量化指令、将访问次数最多的变量放在处理器的寄存器中,优化内存访问,使其命中缓存。。。
HiPE编译器是用来将erlang代码编译为本机代码的,如果你的程序需要大量的数学运算,你应该使用它。不过,一定要检查一下它的局限性。
如果HiPE编译器不够,您可以始终用C编写关键的数学运算并将其包含在内
此外,对于纯数学问题,您应该将Erlang和C(以及其他(进行比较来检查这个问题
关于不变性,除非将整数放在线程的堆上(>60位(,否则它不应该有任何影响,因为这些是唯一需要显式内存处理的整数。
为了评测Erlang代码,您可以从内部使用这些工具来处理Erlang。
最后,你可以随时在这里发布你的片段,也许我们可以指出一些东西。
OTP24:之后
Erlang现在有了JIT,一些报告称改进了25%。