使用斐波那契(Fibonacci)数列来测试各大语言的性能

笔者使用最多的语言是C++,目前项目中在使用Go,也使用过不少其它语言,像Erlang,Python,Lua,C#等等。最近看到C#夺冠,首次荣获 TIOBE 年度编程语言,同时也看到网上有不少Java与C#之争的文章,于是就想要来做一个性能比较。

这里参与性能比较的是以下几门语言:Go、C#、Java、Python、Erlang。这些语言或语言标准库本身都提供了大数计算的支持,不需要自己实现大数计算或者找额外的库来实现大数计算。

笔者选取计算斐波那契(Fibonacci)数列来做性能比较,可能会有局限性,仅作参考。斐波那契数列是指这样一个数列:1,1,2,3,5,8,13,21,34,55,89......这个数列从第3项开始 ,每一项都等于前两项之和。为了达到一定计算量,但又不会费时太久,笔者以计算100万次斐波那契(Fibonacci)数列的耗时来作为依据。

一、测试环境

项目 参数
CPU 11th Gen Intel® Core™ i7-11700 @ 2.50GHz
内存 32G
硬盘 WD NVMe SSD
操作系统 Windows 10 22H2

二、各语言源码

1、Go源码

GO版本为1.12.5

go 复制代码
package main

import (
	"fmt"
	"math/big"
)

func main() {
	a := big.NewInt(1)
	b := big.NewInt(1)
	sum := big.NewInt(0)
	for i := 0; i < 1000000; i++ {
		sum = sum.Add(a, b)
		b.Set(a)
		a.Set(sum)
	}
	fmt.Println(sum)
}

2、C#源码

C#选择的是.net 8.0.101

csharp 复制代码
using System.Numerics;

BigInteger a = new BigInteger(1);
BigInteger b = new BigInteger(1);
BigInteger sum = new BigInteger(0);
for (int i = 0; i < 1000000; i++)
{
	sum = a + b;
	b = a;
	a = sum;
}

Console.WriteLine(sum);

3、Java源码

Java版本是21.0.1

java 复制代码
import java.math.BigInteger;

public class t {
	public static void main(String[] args) {
		BigInteger a = BigInteger.valueOf(1);
		BigInteger b = BigInteger.valueOf(1);
		for (int i = 0; i < 1000000; i++) {
			BigInteger sum = a.add(b);
			b = a;
			a = sum;
		}
		System.out.println(a.toString());
	}
}

4、Python源码

python版本是3.11.7

python 复制代码
import sys

sys.set_int_max_str_digits(1000000)
a = 1
b = 1
sum = 0
for i in range(0, 1000000):
    sum = a + b
    b = a
    a = sum

print(sum)

5、Erlang源码

erlang版本是:otp_win64_26.2.1

erlang 复制代码
-module(app).

-export([main/1]).

fibonacci(A, B, 1) ->
    A+B;
fibonacci(A, B, N) ->
    fibonacci(A+B, A, N-1).

main(_) ->
    V = fibonacci(1,1, 1000000),
    io:format("~w", [V]),
    ok.

二、使用VSCode Code Runner测试

由于有些语言有缓存,所以都以多次执行结果较少耗时的为准:

1. Go

go run main.go

2. C#

dotnet run

3. Java

javac t.java && java t

4. Python

set PYTHONIOENCODING=utf-8 && python.exe -u main.py

5. Erlang

escript app.erl

三、使用命令行测试

1. go

time go run main.go

使用go build main.go编译成exe后再运行time ./main

2. C#

time dotnet run

直接执行生成的exe:

3. Java

time java t

4. Python

time python main.py

5. Erlang

先编译erlc app.erl,再执行time erl -noshell -s app main 0 -s init stop

四、结果统计

语言 Code Runner结果 Code Runner 执行的命令 命令行编译运行结果 命令行编译运行的命令 命令行直接运行结果 命令行直接运行的命令
Go 3.548秒 go run main.go 3.539秒 time go run main.go 3.068秒 time ./main
C# 10.295秒 dotnet run 10.075秒 time dotnet run 9.255秒 time ./ConsoleApp
Java 10.654秒 javac t.java && java t / / 9.814秒 time java t
Python 5.939秒 set PYTHONIOENCODING=utf-8 && python.exe -u main.py 5.943秒 time python main.py / /
Erlang 13.353秒 escript app.erl / / 12.836秒 time erl -noshell -s app main 0 -s init stop

从结果可以看出,Go作为后起的名门之秀,在此项测试中是遥遥领先;C#在没有使用.net 8的AOT特性的情况下,依旧是略胜Java一筹,相信如果使用了AOT,可能会更快,但是其编译速度相比JAVA有点拖后腿;Erlang作为老牌并发编程语言,虽然近几年不断发展,但是在执行效率上还是有待提高;让人大跌眼镜的是Python,在传统认知中Python是应该比C#和JAVA慢的,但是出人意料的是比他们俩都快不少。

相关推荐
F-2H11 分钟前
C语言:指针4(常量指针和指针常量及动态内存分配)
java·linux·c语言·开发语言·前端·c++
苹果酱056714 分钟前
「Mysql优化大师一」mysql服务性能剖析工具
java·vue.js·spring boot·mysql·课程设计
_oP_i1 小时前
Pinpoint 是一个开源的分布式追踪系统
java·分布式·开源
mmsx1 小时前
android sqlite 数据库简单封装示例(java)
android·java·数据库
bryant_meng1 小时前
【python】OpenCV—Image Moments
开发语言·python·opencv·moments·图片矩
武子康2 小时前
大数据-258 离线数仓 - Griffin架构 配置安装 Livy 架构设计 解压配置 Hadoop Hive
java·大数据·数据仓库·hive·hadoop·架构
KevinRay_2 小时前
Python超能力:高级技巧让你的代码飞起来
网络·人工智能·python·lambda表达式·列表推导式·python高级技巧
慕城南风2 小时前
Go语言中的defer,panic,recover 与错误处理
golang·go
Captain823Jack2 小时前
nlp新词发现——浅析 TF·IDF
人工智能·python·深度学习·神经网络·算法·自然语言处理
资源补给站3 小时前
大恒相机开发(2)—Python软触发调用采集图像
开发语言·python·数码相机