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

时间:2010-02-14 13:23:32

标签: erlang

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

5 个答案:

答案 0 :(得分:6)

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

这也很大程度上取决于代码的作用:循环操作的循环或二进制/位串的操作往往会获得最佳的加速,而更正常的元组和列表操作代码可能不会超过8快了~10倍。

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

(自从我查看新的基准测试结果以来已经有一段时间了,但我认为并没有太多变化。)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

在相关的说明中,您可能会发现本文很有用:

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

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

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

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

答案 4 :(得分:0)

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