使用斐波那契(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(R) Core(TM) i7-11700 @ 2.50GHz |
内存 | 32G |
硬盘 | WD NVMe SSD |
操作系统 | Windows 10 22H2 |
二、各语言源码
1、Go源码
GO版本为1.12.5
1package main
2
3import (
4 "fmt"
5 "math/big"
6)
7
8func main() {
9 a := big.NewInt(1)
10 b := big.NewInt(1)
11 sum := big.NewInt(0)
12 for i := 0; i < 1000000; i++ {
13 sum = sum.Add(a, b)
14 b.Set(a)
15 a.Set(sum)
16 }
17 fmt.Println(sum)
18}
2、C#源码
C#选择的是.net 8.0.101
1using System.Numerics;
2
3BigInteger a = new BigInteger(1);
4BigInteger b = new BigInteger(1);
5BigInteger sum = new BigInteger(0);
6for (int i = 0; i < 1000000; i++)
7{
8 sum = a + b;
9 b = a;
10 a = sum;
11}
12
13Console.WriteLine(sum);
3、Java源码
Java版本是21.0.1
1import java.math.BigInteger;
2
3public class t {
4 public static void main(String[] args) {
5 BigInteger a = BigInteger.valueOf(1);
6 BigInteger b = BigInteger.valueOf(1);
7 for (int i = 0; i < 1000000; i++) {
8 BigInteger sum = a.add(b);
9 b = a;
10 a = sum;
11 }
12 System.out.println(a.toString());
13 }
14}
4、Python源码
python版本是3.11.7
1import sys
2
3sys.set_int_max_str_digits(1000000)
4a = 1
5b = 1
6sum = 0
7for i in range(0, 1000000):
8 sum = a + b
9 b = a
10 a = sum
11
12print(sum)
5、Erlang源码
erlang版本是:otp_win64_26.2.1
1-module(app).
2
3-export([main/1]).
4
5fibonacci(A, B, 1) ->
6 A+B;
7fibonacci(A, B, N) ->
8 fibonacci(A+B, A, N-1).
9
10main(_) ->
11 V = fibonacci(1,1, 1000000),
12 io:format("~w", [V]),
13 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#
直接执行生成的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慢的,但是出人意料的是比他们俩都快不少。
- 原文作者:Witton
- 原文链接:https://wittonbell.github.io/posts/2024/2024-01-13-使用斐波那契Fibonacci数列来测试各大语言的性能/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. 进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。