为什么在所有这些小型数学基准测试中,Erlang 比 Java 慢?
在考虑将Java的替代方案用于分布式/并发/故障转移/可扩展的后端环境时,我发现了Erlang。我花了一些时间在书籍和文章上,几乎所有人(甚至是Java上瘾的人)都说Erlang在这样的环境中是一个更好的选择,因为许多有用的东西都是开箱即用的,不容易出错。
我确信Erlang在大多数情况下更快,主要是因为不同的垃圾回收策略(每个进程),没有共享状态(黑白线程和进程)以及更紧凑的数据类型。但是当我发现Erlang与Java数学样本的比较时,我感到非常惊讶,其中Erlang慢了几个顺序,例如从x10到x100。
即使在多个内核和单个内核上的并发任务上也是如此。
这是什么原因呢?这些答案浮现在脑海中:
- 在大多数任务上使用 Java 基元(=> no heap/gc)
- Java 代码和 Erlang 进程中的线程数相同,因此 actor 模型在这里没有优势
- 或者只是Java是静态类型的,而Erlang不是
- 别的?
如果这是因为这些是非常具体的数学算法,任何人都可以展示更多真实/实践的性能测试吗?
更新:到目前为止,我已经得到了答案,总结Erlang不是这种特定的“快速Java案例”的正确工具,但是我不清楚的事情 - 这里这种Erlang效率低下的主要原因是什么:动态类型,GC或糟糕的本机编译?