【问题标题】:What is the performance difference between native and bytecode Erlang modules?本机和字节码 Erlang 模块之间的性能差异是什么?
【发布时间】:2010-02-22 06:05:50
【问题描述】:

本机和字节码 Erlang 模块之间的性能差异是什么?

【问题讨论】:

标签: erlang


【解决方案1】:

对于实际完成大量工作的代码(而不是花费大部分时间等待消息或调用内置函数),典型的加速将在 8 到 20 倍之间。

这也很大程度上取决于代码的确切作用:循环浮点运算或操作二进制文件/位串往往会获得最佳加速,而更普通的元组和列表操作代码可能不会超过 8 -10 倍快。

另外,请记住,如果循环体主要调用其他未编译为原生代码的模块,编译为原生代码的循环不会快得多。

(我已经有一段时间没有看到新的基准测试结果了,但我认为变化不大。)

【讨论】:

  • 啊,是的,我想那是你在瑞典电脑前的照片! :) 抱歉,我不得不问,但很多人在 StackOverflow 上发帖时并没有真正完成他们所说的事情,只是简单地传递“异端”,但你似乎是真正的交易
【解决方案2】:

已经有一些正确的答案,但我认为您实际上需要衡量特定功能的性能。如果临界区比字节码版本快得多,那么可能仍然需要清理模块以使其具有故障安全性。

【讨论】:

    【解决方案3】:

    在性能方面,HiPE 在模块内进行优化 - 而不是模块间调用。这可以产生非常好的加速(x4..x10 似乎是通常被吹捧的数字),但是正如其他人所回答的那样,如果您的代码花费大量时间等待外部事件,那么加速将可以忽略不计。

    需要注意的是,HiPE 显然不支持某些渐进式语言功能,例如参数化模块。这意味着一些最近的应用程序(例如 MochiWeb)根本无法运行。考虑到这一点。

    【讨论】:

      【解决方案4】:

      在相关说明中,您可能会发现这篇论文很有用:

      user.it.uu.se/~kostis/Papers/erlang03.pdf

      在描述使用 HiPE 产生的限制时,它也有一些(非常基本的)速度比较。

      我发现最值得注意的两件事:

      • 旧的 HiPE 代码在重新加载时不会消失,而是永远存在。因此,如果您处于非常频繁地重新加载代码的环境中,则存在少量内存泄漏。通常不是真正的问题,但如果您没有一个好的节点“退出策略”(它允许您无缝地将节点从集群中取出并不时用新节点替换它们),那么值得考虑 - 这也是无价的当您想升级到较新的 BEAM-VM 版本时使用。)
      • 在本机代码和解释代码之间切换时会产生一些开销,因此您应尽可能避免这种情况(通过编译与同一编译器频繁交互的所有模块)

      【讨论】:

        【解决方案5】:

        原生应该更快。我不认为它的速度有多快是一个不变的因素。基于机器/架构等,它肯定是不同的。

        【讨论】:

        • 我在网上找不到太多关于这个的东西,所以想知道我是否可以在本地机器上获得 10 倍的速度提升。
        • 我也不知道任何来源。对不起。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-05
        相关资源
        最近更新 更多