筆者使用最多的語(yǔ)言是C++,目前項(xiàng)目中在使用Go,也使用過(guò)不少其它語(yǔ)言,像Erlang,Python,Lua,C#等等。最近看到C#奪冠,首次榮獲 TIOBE 年度編程語(yǔ)言,同時(shí)也看到網(wǎng)上有不少Java與C#之爭(zhēng)的文章,于是就想要來(lái)做一個(gè)性能比較。
這里參與性能比較的是以下幾門語(yǔ)言:Go、C#、Java、Python、Erlang。這些語(yǔ)言或語(yǔ)言標(biāo)準(zhǔn)庫(kù)本身都提供了大數(shù)計(jì)算的支持,不需要自己實(shí)現(xiàn)大數(shù)計(jì)算或者找額外的庫(kù)來(lái)實(shí)現(xiàn)大數(shù)計(jì)算。
筆者選取計(jì)算斐波那契(Fibonacci)數(shù)列來(lái)做性能比較,可能會(huì)有局限性,僅作參考。斐波那契數(shù)列是指這樣一個(gè)數(shù)列:1,1,2,3,5,8,13,21,34,55,89……這個(gè)數(shù)列從第3項(xiàng)開(kāi)始 ,每一項(xiàng)都等于前兩項(xiàng)之和。為了達(dá)到一定計(jì)算量,但又不會(huì)費(fèi)時(shí)太久,筆者以計(jì)算100萬(wàn)次斐波那契(Fibonacci)數(shù)列的耗時(shí)來(lái)作為依據(jù)。
一、測(cè)試環(huán)境
項(xiàng)目 | 參數(shù) |
---|---|
CPU | 11th Gen Intel? Core? i7-11700 @ 2.50GHz |
內(nèi)存 | 32G |
硬盤 | WD NVMe SSD |
操作系統(tǒng) | Windows 10 22H2 |
二、各語(yǔ)言源碼
1、Go源碼
GO版本為1.12.5
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
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
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
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
-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測(cè)試
由于有些語(yǔ)言有緩存,所以都以多次執(zhí)行結(jié)果較少耗時(shí)的為準(zhǔn):
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
三、使用命令行測(cè)試
1. go
time go run main.go
使用go build main.go
編譯成exe后再運(yùn)行time ./main
2. C#
time dotnet run
直接執(zhí)行生成的exe:
3. Java
time java t
4. Python
time python main.py
5. Erlang
先編譯erlc app.erl
,再執(zhí)行time erl -noshell -s app main 0 -s init stop
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-799166.html
四、結(jié)果統(tǒng)計(jì)
語(yǔ)言 | Code Runner結(jié)果 | Code Runner 執(zhí)行的命令 | 命令行編譯運(yùn)行結(jié)果 | 命令行編譯運(yùn)行的命令 | 命令行直接運(yùn)行結(jié)果 | 命令行直接運(yùn)行的命令 |
---|---|---|---|---|---|---|
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 |
從結(jié)果可以看出,Go作為后起的名門之秀,在此項(xiàng)測(cè)試中是遙遙領(lǐng)先;C#在沒(méi)有使用.net 8的AOT特性的情況下,依舊是略勝Java一籌,相信如果使用了AOT,可能會(huì)更快,但是其編譯速度相比JAVA有點(diǎn)拖后腿;Erlang作為老牌并發(fā)編程語(yǔ)言,雖然近幾年不斷發(fā)展,但是在執(zhí)行效率上還是有待提高;讓人大跌眼鏡的是Python,在傳統(tǒng)認(rèn)知中Python是應(yīng)該比C#和JAVA慢的,但是出人意料的是比他們倆都快不少。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-799166.html
到了這里,關(guān)于使用斐波那契(Fibonacci)數(shù)列來(lái)測(cè)試各大語(yǔ)言的性能的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!