【问题标题】:Why is math so slow in Erlang/the BEAM VM? [closed]为什么 Erlang/BEAM VM 中的数学运算这么慢? [关闭]
【发布时间】:2020-12-16 17:46:46
【问题描述】:

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

【问题讨论】:

    标签: erlang beam


    【解决方案1】:

    OTP24 之前:

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

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

    HiPE 编译器用于将 erlang 代码编译为本机代码,如果您的程序使用大量数学运算,您应该使用它。不过,请务必查看其limitations

    如果HiPE 编译器不够用,您可以随时在C and include it 中编写关键数学运算。

    此外,你应该检查这个question with a comparison between Erlang and C (and others) for a pure math problem

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

    为了分析 Erlang 代码,您有 these tools 从内部处理 Erlang。

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

    OTP24 之后:

    Erlang now has JIT,一些reports 状态提高了 25%。

    【讨论】:

    • 很好的答案,只需添加从 OTP 24 开始,HiPE 将消失 github.com/erlang/otp/pull/2854 并将引入 JIT github.com/erlang/otp/pull/2745。您可能需要相应地修改您的答案:-)
    • @aronisstav 我从 Lukas 的一些帖子中知道有些东西正在制作中,但并不是说它是如此接近,谢谢!一旦 OTP 24 确定出来,我会修改它
    猜你喜欢
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多