erlang与jvm(scala)递归性能



作为学习scala和函数编程的练习,我实现了以下非尾部递归def,它可以计算任何位置的pascal数。程序本身就是帕斯卡三角形的定义。图片如下

1
1  1
1  2  1
1 3   3 1
1 4  6  4 1
1 5 10 10 5 1
...
def pascal(c: Int, r: Int): Int =
if (c == 0 || c == r) 1 else pascal(c - 1, r - 1) + pascal(c, r - 1)

然而,当尝试在Mac OS X 10.6.8(2.53 GHz Intel Core 2 Duo)上运行pascal(25,50)时,它在20分钟后仍未完成运行

为了与erlang进行比较,我安装了R15B02,并编写了如下等效程序:

-module(pascal).
-export([calc_pascal/2]).
calc_pascal(0,_) -> 1;
calc_pascal(C,R) when C==R -> 1;
calc_pascal(C,R) when C<R  -> calc_pascal(C-1,R-1) + calc_pascal(C-1,R).

pascal:calc_pascal(25,50)~4sec内完成。

为什么会出现如此巨大的性能差异?jvm是否不如递归程序的erlang运行时那么高级?

如果我在Scala程序中犯了与Erlang版本中相同的错误,它会运行得很快。这可能是原因吗?

Pascal在ms 中的数字性能

c,r     Scala   Erlang
10,20   21      22
11,22   6       72
12,24   16      272
13,26   71      1034
14,28   299     3982
15,30   802     16124
16,32   3885    60420

最新更新