刚才测试了一下 Node.js 与 python 的计算性能,震惊了

2014-05-23 10:10:25 +08:00
 codingpp
测试脚本之一,是计算40位的斐波那契数列,测试脚本如下:
node.js
function fibo (n) {
return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;
}
console.log(fibo(40));

python
def fibo(n):
return fibo(n - 1) + fibo(n - 2) if n > 1 else 1
print fibo(40)

php
<?php
function fibo($n){
if($n > 1) {
return fibo($n - 1) + fibo($n - 2);
} else {
return 1;
}
}
echo fibo(40);

测试结果如下:

node.js
real 0m3.329s
user 0m3.318s
sys 0m0.010s

python
real 1m11.325s
user 1m11.259s
sys 0m0.015s

php
real 1m26.551s
user 1m26.448s
sys 0m0.027s


node.js居然比python快了23倍之多

之后我又写了一个测试脚本,就是简单的循环
i = 0
t = 1
while(i < 50000000):
t = t + i
i += 1
print t

node.js居然比python快了70多倍。。比php快了16倍,c语言也比node.js慢了一点点

虽然也知道python慢,但是这个差的有点多啊
58445 次点击
所在节点    Python
105 条回复
est
2014-05-23 13:30:30 +08:00
for循环测试语言性能是月经话题。
madeye
2014-05-23 13:42:17 +08:00
tail call elimination 算是 JIT 最拿手的事情了… 只怪 Python 一直没有真正靠谱的 JIT 实现。
codingpp
2014-05-23 14:07:11 +08:00
@binux
首先看到这个测试结果,你应该思考造成这些差异的主要原因是什么,而不是由于自己什么都不懂,各种语言实现太复杂,关联点太多,而认为这个问题你永远都无法理解,你应该有确认什么是主要因素的能力。
那不说各种语言了,就说同样的程序,在ie8和firefox中的差异怎么那么大
我在附言里就已经说了想了解 v8引擎是如何对递归、循环做优化的
binux
2014-05-23 14:13:13 +08:00
@codingpp 你在测试之前都不知道有什么会影响性能,比例是多少,用一个你自己都不知道什么会影响的用例,你要得出什么结论?
ok,在这个实际没用人用例子中,python是慢,然后呢,你导出任何有用结论吗?
codingpp
2014-05-23 14:33:35 +08:00
@binux
我在测试之前认为有差距,不过不大,但是测试结果却和我想的不一样,差距肯定是在什么关键地方,python和php只是普通的处理,nodejs做了优化。看到这个差异以后,然后我们就要去想这个问题在实际中有什么影响吗?不应该去搞清楚为什么吗。。。我不相信这个问题在数据分析计算的时候可以直接忽略。
函数调用,循环,变量,运算差异那么大,为什么python和php相差无几呢?

结论?那就是在某些场景使用语言的时候不用python了呗,或者考虑使用pypy,如果pypy也一样做了优化的话
binux
2014-05-23 14:39:21 +08:00
@codingpp 实际中你会这么写代码吗?
codingpp
2014-05-23 14:52:20 +08:00
@binux
看到这个差异以后,然后我们就要去想这个问题在实际中有什么影响吗?不应该去搞清楚为什么吗。。。
我实际上都不写c语言,我难道不该学c语言吗?我实际上不直接写数据结构,我难道不该学数据结构吗?
我之前还听过一些专科生嘲讽,你本科学那么杂的东西,实际中用的到吗,不能用到干嘛要学。。

回到这个问题。。实际中会写啊,递归、循环难道不是经常会用到。
binux
2014-05-23 14:58:29 +08:00
@codingpp 你程序递归占多少?这里几个语言都是实用语言,又不是实验学院语言,设计是有场景的,有目的的。
不看实际场景,测出来的结果,OK,我就是慢,但是在别人设计场景下人不care,和实际没有关系,你这个测试有半毛钱意义?
codingpp
2014-05-23 15:11:06 +08:00
@binux
目的就是为了搞清这个问题,而且实际上也会有关系,不过实际上也不是我主要关注的
ok打住不再回应类似目的意义这个问题了
hooluupog
2014-05-23 15:18:51 +08:00
@codingpp “那不说各种语言了,就说同样的程序,在ie8和firefox中的差异怎么那么大
我在附言里就已经说了想了解 v8引擎是如何对递归、循环做优化的”-----------
我个人的猜测:firefox有asm.js; ie8?这简直是欺负ie,应该找ie10,11来试试。至于v8,它用了JIT优化但也不至于像asm.js那么极端,那已经比的不是js本身的性能了,感兴趣的话可以试试google的pnacl下c/c++代码的实现版本,跑出的性能,应该比asm.js还要快,但还是会比直接在机器上跑c/c++慢一些。

p.s.建议: lz可以把你的测试程序改成尾递归的版本再测试下试试。
此外,用具有循环语法的非函数式语言去测试递归版本的斐波那契数列是最糟糕的测试,而且实际中这些语言的斐波那契数列实现也不会这么去写,所以这根本无法反映实际问题。为那种根本用不上的纯粹为了跑分而去优化的情况,大多数主流的编程语言编译器不会去干的,没有意义。所以,lz可以测试下其他的例子,不要再用递归版的斐波那契数列来做测试了。
glasslion
2014-05-23 15:19:51 +08:00
@codingpp
@binux

实际场景里当然有关系啦,看到这样的代码,必然svn|git blame, 然后就准备吃散伙饭了
codingpp
2014-05-23 15:42:31 +08:00
@glasslion
使用递归的例子最容易想出来的就是这个了~ 优化了就不知道在测什么了,我主要想搞清楚递归循环优化的问题,明白的人就会给出答案,不明白的又想装B刷存在感就来喷递归咯~
2ex
2014-05-23 15:53:55 +08:00
看大家秀各自都会很多语言,很有意思。
glasslion
2014-05-23 16:02:50 +08:00
@codingpp 真要测递归也不应该用你给的代码.你怎么知道nodejs会用递归而不是而不是去执行那段代码,
miser
2014-05-23 16:15:01 +08:00
这样的比较意义何在?
codingpp
2014-05-23 16:32:20 +08:00
@miser
意义如下:
关于递归的问题,就是由于尾递归优化的问题,node.js做了优化而python没有,所以在使用递归的时候要注意,如何可以实现node.js那样使用python递归现在还不清楚。
关于循环的问题,现在还没有答案,你觉得这个答案也没有意义吗?
miser
2014-05-23 17:13:55 +08:00
@codingpp 那也只能说这一项nodejs比py好,其它的呢? 下方直接说 ”node.js居然比python快了70多倍“这个不是在误导人吗? 按照 ”node.js居然比python快了70多倍”的说法,你这样的比较就有意义了?
notcome
2014-05-23 17:31:37 +08:00
大家有没有注意楼主似乎还在用 XP?
codingpp
2014-05-23 17:33:14 +08:00
@miser
呵呵
循环累加 的确是快了70倍 有前提 有结果 怎么谈误导人?你自己测?
你如果知道为什么,就会在这里讲出来,你什么都不知道,上面在讨论什么你也看不明白,又想在这说两句当然就会喷这个东西无意义了~~
codingpp
2014-05-23 17:33:48 +08:00
@notcome
恩? 没有注意
哪里看出来的?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/113887

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX