为什么在所有这些小型数学基准测试中,Erlang 比 Java 慢?

2022-09-01 07:33:04

在考虑将Java的替代方案用于分布式/并发/故障转移/可扩展的后端环境时,我发现了Erlang。我花了一些时间在书籍和文章上,几乎所有人(甚至是Java上瘾的人)都说Erlang在这样的环境中是一个更好的选择,因为许多有用的东西都是开箱即用的,不容易出错。

我确信Erlang在大多数情况下更快,主要是因为不同的垃圾回收策略(每个进程),没有共享状态(黑白线程和进程)以及更紧凑的数据类型。但是当我发现Erlang与Java数学样本的比较时,我感到非常惊讶,其中Erlang慢了几个顺序,例如从x10到x100。

即使在多个内核和单个内核上的并发任务上也是如此。

这是什么原因呢?这些答案浮现在脑海中:

  • 在大多数任务上使用 Java 基元(=> no heap/gc)
  • Java 代码和 Erlang 进程中的线程数相同,因此 actor 模型在这里没有优势
  • 或者只是Java是静态类型的,而Erlang不是
  • 别的?

如果这是因为这些是非常具体的数学算法,任何人都可以展示更多真实/实践的性能测试吗?

更新:到目前为止,我已经得到了答案,总结Erlang不是这种特定的“快速Java案例”的正确工具,但是我不清楚的事情 - 这里这种Erlang效率低下的主要原因是什么:动态类型,GC或糟糕的本机编译?


答案 1

Erlang不是为数学而生的。它的构建考虑了通信,并行处理和可扩展性,因此测试数学任务有点像测试您的手提钻是否能为您提供令人耳目一新的按摩体验。

也就是说,让我们稍微补充一下:
如果你想在JVM中使用Erlang风格的编程,看看Scala ActorsAkka框架Vert.x


答案 2

基准测试除了它们真正测试的内容之外,永远都不能说别的什么。如果你觉得基准测试只是在测试原语和经典的线程模型,这就是你得到的知识。现在,您可以放心地说,Java在基元上的数学以及这些类型问题的经典线程模型方面比Erlang更快。你对大量线程的性能或更复杂的问题一无所知,因为基准测试没有对此进行测试。

如果你正在做基准测试测试的数学类型,那就使用Java,因为它显然是这项工作的正确工具。如果你想做一些高度可扩展的事情,几乎没有共享状态,找到一个基准,或者至少重新评估Erlang。

如果你真的需要在Erlang中做大量的数学运算,请考虑使用HiPE(无论如何都要考虑一下)。


推荐