主流编程语言性能实测:Go、Python、PHP、C++、Java与Node.js对比
本文通过斐波那契算法测试对比Go、Python、PHP、C++、Java及Node.js的运行性能。结果显示Go 1.8与PHP 7性能显著提升,C/C++经-O2优化后速度翻倍,Node.js执行时间接近Java但代码更简洁。文章强调性能非唯一指标,需综合考量可维护性与扩展性。
在接触PHP、C++、Go和Python的过程中,作者突发奇想,希望对这些主流编程语言的执行性能进行一次简易对比。为了直观展示差异,测试选用了经典的斐波那契算法,这既常见又具有一定的趣味性。
正如那句名言所说:“空谈误国,实干兴邦”,接下来直接展示代码与测试结果。在Mac环境下,使用Clion编辑器开始编写测试程序。
首先介绍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);
}
首先使用Go 1.7版本进行测试,具体运行时间如下:
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
随后,测试Go 1.8版本的性能表现:
go version go1.8 darwin/amd64
real 0m0.204s user 0m0.153s sys 0m0.062s
real 0m0.051s user 0m0.045s sys 0m0.003s
从数据上看,Go 1.7与1.8版本的运行时间差异不大。尽管官方声称1.8版本在垃圾回收(GC)和编译方面优化提升了20%,但可能因为该测试demo过于简单,未能充分体现这一优势。
接下来是Python,这也是近期备受关注的语言,因此纳入对比范围。
def fibonacci(i):
if i<2:
return i
return fibonacci(i-2) + fibonacci(i-1)
print(fibonacci(34))
首先查看Python 2.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
接着测试Python 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
对比结果显而易见,Python版本越高运行越慢。更关键的是,高版本与低版本之间存在语法不兼容的问题。虽然Python适合编写算法原型或小型脚本,但在其他场景下,作者更倾向于使用Go语言。
PHP是作者日常工作主要使用的语言,因此也必须进行对比测试。
<?php
function fibonacci($i){
if($i<2) return $i;
return fibonacci($i-2) + fibonacci($i-1);
}
echo fibonacci(34);
由于作者的工作主要基于PHP 5.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
测试环境包含PHP 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
对于新项目或个人实验,通常使用PHP 7,测试结果如下:
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
可以看出,PHP 7与PHP 5系列相比有着天壤之别,性能提升巨大。在此感谢鸟哥(PHP核心贡献者)的贡献,建议开发者尽可能使用PHP 7。
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
优化效果非常明显,运行时间仅为未优化版本的一半。
此外,作者也编写了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语言与C++14的表现一致,优化后速度明显提升,运行时间缩短了一半。
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
Java的运行性能尚可,但与C++和Go相比,其编译时间显得相当耗时。
最后出场的是近年来热度极高的JavaScript,准确来说是指Node.js(它与Java并无直接关系)。
function fibonacci(i){
if(i<2) return i;
return fibonacci(i-2) + fibonacci(i-1);
}
console.log(fibonacci(34))
Node.js的执行结果如下:
qiangjian@localhost:/works/learnCPP$ node -v && time node fib.js v6.10.0 real 0m0.332s user 0m0.161s sys 0m0.062s
结果令人震惊,执行时间仅为0.3秒左右,总耗时不到0.5秒,几乎接近Java的性能。然而,在代码量和可维护性方面,这要归功于Google、Chromium团队的V8引擎以及开源社区的贡献。
如果Node.js能够保持稳定的运行表现,未来或许真的能在编程领域占据主导地位。当然,这仅是个人看法,不必过于当真。
以下是测试数据的图表展示:

总结:
每种语言都有其特定的适用场景,性能只是单一指标。作者更看重的是代码的可读性、可维护性、可移植性、健壮性以及扩展性,性能排在其次。随着现代硬件性能的提升(如手机内存普遍达到8GB,CPU性能超越五年前的PC,SSD普及等),对极致性能的依赖有所降低。作者比较看好Golang、PHP和Python,同时也关注现代C++(如14、17版本)。至于Rust、Swift、Java和Scala,则主要取决于个人需求及公司的技术栈选择。先写这么多。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









