刚才测试了一下 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慢,但是这个差的有点多啊
58365 次点击
所在节点    Python
105 条回复
codingpp
2014-05-23 11:24:06 +08:00
@binux
如果测试实际应用,写一个web程序,那本文的标题计算性能就该改成io性能了
5000万次web查询与5000万次计算语言性能上应该已经无足轻重了

我这里就是想要测试一下计算性能,做了最简单的循环计算,你说的差异太大不可以这样测是什么意思,应该去测什么?
ddyy
2014-05-23 11:29:47 +08:00
所有脱离实际项目的性能测试都是耍流氓
yueyoum
2014-05-23 11:30:01 +08:00
@codingpp

1. 你把40搞大一点
2. 按照 斐波那契数列 数列的定义,

F(0) = 0
F(1) = 1
F(2) = F (1) + F (0) = 1

你看看的程序输出的是1 吗?


你看我的gist吧, 0.017s
jiang42
2014-05-23 11:34:19 +08:00
LZ 你这不科学
1. 测试次数太少,使用的平台太少
2. 测试用的程序不行,没有测试到方方面面
3. 我若是没记错的话,nodejs 用了 JIT 来优化的
我用 pypy 试了试,差距在 3.5 倍左右
如果用 numpy 会更快的吧- -
4. 一个程序高效与否,还是得看写程序的人的算法功底,如果 Jeff Dean 写出来的代码都不行,那
才考虑换语言。
Feiox
2014-05-23 11:36:49 +08:00
@codingpp 在 Python 世界里有大量的关于科学计算、数据分析的包,这说明了 ~ ~ ~

@codingpp js with V8 确实快的吓人。而 PHP 啧啧 ~
jsonline
2014-05-23 11:39:20 +08:00
知道 JS 的牛逼之处了吧,不用优化性能就很不错,呵呵。
ChiangDi
2014-05-23 11:40:50 +08:00
楼主你这也叫测试。
skybr
2014-05-23 11:41:32 +08:00
不改算法, cPython要提高这东西的性能也挺容易的.

把那段fib改两行保存成pyx, 提速到node的1/10

cdef long _fibo(long n): return _fibo(n - 1) + _fibo(n - 2) if n > 1 else 1

fibo = lambda long n: _fibo(n)
jiang42
2014-05-23 11:44:30 +08:00
@jsonline
我是来打你脸的,刚才确认了 nodejs 是用了 JIT 技术的
这算是没优化?
Sdhjt
2014-05-23 11:45:11 +08:00
这种测试怎么少得了Golang呢,来凑个热闹,以下是50位的测试结果:

node.js:
20365011074

real 3m34.670s
user 0m0.000s
sys 0m0.015s

Golang:
20365011074

real 1m36.976s
user 0m0.015s
sys 0m0.015s

50位哦,40位速度太快,误差大。
phyng
2014-05-23 11:45:29 +08:00
果然这种帖子好赚金币啊
jiang42
2014-05-23 11:47:07 +08:00
@Sdhjt
简直耍流氓啊
要不我写个 C 的?
Sdhjt
2014-05-23 11:51:14 +08:00
@jiang42 Golang有动态语言特性啊,C有么?
codingpp
2014-05-23 11:52:20 +08:00
@yueyoum
刚才没看到,不过你的python的算法和我的nodejs算法是不一样的,没有使用到递归,是没有可比性的
使用同样的算法再试一遍?
jiang42
2014-05-23 11:53:32 +08:00
@codingpp
人家的意思是说没哪个二傻子会用递归
都用动态规划给优化掉了
codingpp
2014-05-23 11:53:59 +08:00
@ChiangDi
恩 才疏学浅 请赐教
codingpp
2014-05-23 11:55:24 +08:00
@jiang42
那我想要测试递归的性能
我该如何写呢?
codingpp
2014-05-23 11:56:12 +08:00
@jiang42
找一个不能用动态规划优化的递归的程序才可以测试?
jiang42
2014-05-23 11:58:37 +08:00
@codingpp
没啊
这就能测试了啊。。。
jiang42
2014-05-23 11:59:01 +08:00
@Sdhjt
给跪了。。

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

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

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

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

© 2021 V2EX