golang、python、php、c++、c、java、Nodejs性能对比


Posted in NodeJs onMarch 12, 2017

本人在PHP/C++/Go/Py时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不得不用神奇的斐波那契算法。可能是比较常用或好玩吧。

好了,talk is cheap, show me your code! 打开Mac,点开Clion开始Coding吧!

1.怎么第一是Go呢,因为我个人最近正在用,感觉很不错

package main
import "fmt"
func main(){
  fmt.Println(fibonacci(34))
}
func fibonacci(i int) int{
  if(i<2){
    return i;
  }
  return fibonacci(i-2) + fibonacci(i-1);
}

先用 Go1.7看看:

qiangjian@localhost:/works/learnCPP$ go version && time go build  fib.go  && time ./fib

go version go1.7.5 darwin/amd64
real    0m0.206s

user    0m0.165s

sys     0m0.059s
real    0m0.052s

user    0m0.045s

sys     0m0.004s

然后,再看看1.8的:

qiangjian@localhost:/works/learnCPP$ go18 version && time go18 build  fib.go  && time ./fib

go version go1.8 darwin/amd64
real    0m0.204s

user    0m0.153s

sys     0m0.062s
real    0m0.051s

user    0m0.045s

sys     0m0.003s

感觉看不出差异,但官方1.8在GC、Compile等方面优化提升了20%,可能是这demo太简单了吧。

2.Python,最近玩得也火热,所以拿来比比

def fibonacci(i):
  if i<2:
    return i
  return fibonacci(i-2) + fibonacci(i-1)
 
print(fibonacci(34))

先来看看python2.7

qiangjian@localhost:/works/learnCPP$ python2 -V && time python2 ./fib.py 
Python 2.7.13
5702887

real 0m2.651s
user 0m2.594s
sys 0m0.027s

接着是Py 3.5

qiangjian@localhost:/works/learnCPP$ python3 -V && time python3 ./fib.py 
Python 3.5.1

real  0m3.110s
user  0m2.982s
sys   0m0.026s

一眼就看出Py最大的问题了:越升级越慢, 而且要命的是很多语法不兼容,但平时写写算法、小程序还不错,其它的时候,就算了,还是用Go吧。

3.PHP嘛,我工作用的多,所以也必须比较下

<?php
function fibonacci($i){
  if($i<2) return $i;
  return fibonacci($i-2) + fibonacci($i-1);
}
echo fibonacci(34);

由于我的工作主要用的php5.4,所以先来波:

qiangjian@localhost:/works/learnCPP$ php54 -v && time php54 fib.php 
PHP 5.4.43 (cli) (built: Dec 21 2016 12:01:59) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
real  0m2.288s
user  0m2.248s
sys   0m0.021s

测试环境是5.6,所以也来波:

qiangjian@localhost:/works/learnCPP$ php -v && time php fib.php 
PHP 5.6.28 (cli) (built: Dec 6 2016 12:38:54) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
real  0m2.307s
user  0m2.278s
sys   0m0.017s

新项目、自己玩什么的都是php7, 请看:

qiangjian@localhost:/works/learnCPP$ php -v && time php fib.php
PHP 7.1.2 (cli) (built: Feb 17 2017 10:52:17) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
5702887
real  0m0.815s
user  0m0.780s
sys   0m0.015s

感觉php7和5是天壤之别,完全不是一个东西,而且进步提升太大了,在此依赖鸟哥点个赞!建议大家多用php7.

4.C++是我最爱的理论基础,当然说的是C++11/14,不是老古董c99等

#include <iostream>
 
constexpr int fibonacci(const int i){
  if(i<2) return i;
  return fibonacci(i-2) + fibonacci(i-1);
}
 
int main() {
  fibonacci(34);
  return 0;
}

先用g++ 6.2 无优化看看:

qiangjian@localhost:/works/learnCPP$ time g++-6 -o a.bin main.cpp && time ./a.bin 

real  0m0.378s
user  0m0.254s
sys   0m0.104s

real  0m0.050s
user  0m0.043s
sys   0m0.002s

加优化-O2后,

qiangjian@localhost:/works/learnCPP$ time g++-6 -O2 -o a.bin main.cpp && time ./a.bin 

real  0m0.874s
user  0m0.344s
sys   0m0.180s

real  0m0.034s
user  0m0.019s
sys   0m0.004s

效果还是很明显的, 运行时间只有前者一半。

5. C也写了个

#include <stdio.h>
 
int fibonacci(int i){
  if(i<2) return i;
  return fibonacci(i-2) + fibonacci(i-1);
}
int main(){
  printf("%d",fibonacci(34));
}

不加优化:

qiangjian@localhost:/works/learnCPP$ time gcc-6 -o c.bin fib.c && time ./c.bin 

real  0m0.341s
user  0m0.063s
sys   0m0.101s
real  0m0.049s
user  0m0.044s
sys   0m0.002s

加-O2优化:

qiangjian@localhost:/works/learnCPP$ time gcc-6 -O2 -o c.bin fib.c && time ./c.bin 

real  0m0.143s
user  0m0.065s
sys   0m0.034s
real  0m0.034s
user  0m0.028s
sys   0m0.002s

和C++14一样, 优化后提速明显,快了一倍。

6.Java,是我最不想写的,虽然它很火,感觉太臃肿了

class Fib{
  public  static void main(String[] args){
    System.out.println(fibonacci(34));
 
  }
 
  static int fibonacci( int i){
    if(i<2) return i;
    return fibonacci(i-2) + fibonacci(i-1);
  }
}

编译、运行的结果是:

qiangjian@localhost:/works/learnCPP$ java -version && time javac Fib.java && time java Fib 
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

real  0m0.952s
user  0m1.302s
sys   0m0.144s

real  0m0.150s
user  0m0.123s
sys   0m0.025s

性能还行, Compile时间和c++/go比就太low了。

7.最后出场的当然是一直大紫大红的javascript,不,准确说是Nodejs(这玩意和java真tmd没半毛钱关系)

function fibonacci(i){
  if(i<2) return i;
  return fibonacci(i-2) + fibonacci(i-1);
}
console.log(fibonacci(34))

结果:

qiangjian@localhost:/works/learnCPP$ node -v && time node fib.js 
v6.10.0

real  0m0.332s
user  0m0.161s
sys   0m0.062s

结果还是令人震惊的,竟然只有TMD 0.3s,一共也不到0.5s,几乎接近java了, 但这代码量、维护性的优势还真得多感谢Google爹、Chromium爹的V8儿子以及开源社区。

如果Nodejs真的运行得稳定了, 不准真能一统“程序江湖”, 当然我只是说说,不要太认真。

来张图中吧:

golang、python、php、c++、c、java、Nodejs性能对比

总结:

感觉每种language都不同用途,性能只是一个很单一的指标,我本人比较看重的是:可阅读性、可维护性、可移植性、健壮性、扩展性,然后是性能。 而且现代硬件越来越牛逼,动不动手机就8个G,cpu赶上5年前的PC的cpu了,ssd普及化...。 本人比较看好Golang/php/python,也关注现代的C++,如14、17, 至于rust、swift、java、scala就算了,这主要和个人的需要、公司技术栈相关。哈哈! 先写这么多吧!

NodeJs 相关文章推荐
nodejs实用示例 缩址还原
Dec 28 NodeJs
轻松创建nodejs服务器(9):实现非阻塞操作
Dec 18 NodeJs
Nodejs学习笔记之NET模块
Jan 13 NodeJs
浅谈Nodejs观察者模式
Oct 13 NodeJs
nodejs微信公众号支付开发
Sep 19 NodeJs
nodejs个人博客开发第三步 载入页面
Apr 12 NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 NodeJs
Nodejs实现的操作MongoDB数据库功能完整示例
Feb 02 NodeJs
PHPStorm中如何对nodejs项目进行单元测试详解
Feb 28 NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 NodeJs
ubuntu系统下使用pm2设置nodejs开机自启动的方法
May 12 NodeJs
Node.js实现爬取网站图片的示例代码
Apr 04 NodeJs
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 #NodeJs
nodejs实用示例 缩址还原
Dec 28 #NodeJs
nodejs 后缀名判断限制代码
Mar 31 #NodeJs
NodeJS框架Express的模板视图机制分析
Jul 19 #NodeJs
用nodejs访问ActiveX对象,以操作Access数据库为例。
Dec 15 #NodeJs
NodeJS 模块开发及发布详解分享
Mar 07 #NodeJs
nodejs入门详解(多篇文章结合)
Mar 07 #NodeJs
You might like
《心理测量者3》剧场版动画预告
2020/03/02 日漫
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
2017/02/23 PHP
PHP使用ActiveMQ实例
2018/02/05 PHP
利用PHP如何统计Nginx日志的User Agent数据
2019/03/06 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
innerHTML,outerHTML,innerTEXT三者之间的区别
2007/01/28 Javascript
jquery 防止表单重复提交代码
2010/01/21 Javascript
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
2010/06/02 Javascript
js实现杯子倒水问题自动求解程序
2013/03/25 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
2017/02/18 Javascript
AngularJS实现根据不同条件显示不同控件
2017/04/20 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
vue实现移动端图片上传功能
2019/12/23 Javascript
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
Python字符串、元组、列表、字典互相转换的方法
2016/01/23 Python
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
python正则表达式的使用
2017/06/12 Python
Python实现希尔排序算法的原理与用法实例分析
2017/11/23 Python
python操作excel的方法
2018/08/16 Python
Python当中的array数组对象实例详解
2019/06/12 Python
Python小程序 控制鼠标循环点击代码实例
2019/10/08 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
css3 按钮 利用css3实现超酷下载按钮
2013/03/18 HTML / CSS
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
浅析css3中matrix函数的使用
2016/06/06 HTML / CSS
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
计生专干事迹
2014/05/28 职场文书
营销学习心得体会
2014/09/12 职场文书
民主生活会对照检查材料
2014/09/22 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
python自动化测试通过日志3分钟定位bug
2021/11/20 Python