Node.js 和其他语言性能对比
- · -
下面是使用不同语言求斐波那契数列第 40 项的程序。
1. 测试环境
1.1 系统环境
- CPU: i7-9700K
- 内存:48G 2666MHz
- 硬盘:Samsung SSD 870 QVO 1TB
- 操作系统:macOS 13.4.1
1.2 语言版本
- nodejs: v18.16.0
- swift: swift-driver version: 1.75.2 Apple Swift version 5.8.1
- php: PHP 8.2.9 (cli)
- dart: Dart SDK version: 3.1.0 (stable)
- java: openjdk 11.0.20 2023-07-18
- go: go version go1.21.0 darwin/amd64
- c: Apple clang version 14.0.3
- python: Python 3.11.4
- rust: rustc 1.69.0 (84c898d65 2023-04-16)
2. 测试方法
各个解释器和编译器不做优化调整,使用默认配置, c、java 编译后执行,swift、dart、go、rust 直接执行和编译后执行两种都测试,其他语言直接执行,执行时使用 time
命令计算执行时间,每种语言执行多次,需要编译的,编译操作只执行一次,取最快的执行时间。
// nodejs
time node fib.js
// swift
time swift fib.swift
// swift 编译后
swiftc -o fib-swift fib.swift
time ./fib-swift
// php
time php fib.php
// dart
time dart fib.dart
// dart 编译后
dart compile exe -o fib-dart fib.dart
time ./fib-dart
// java
java c Fib.java
time java Fib
// go
time go run fib.go
// go 编译后
go build fib.go
time ./fib
// c
gcc fib.c -o fib-c
time ./fib-c
// python
time python fib.py
// rust
time rustc fib.rs
3. 测试结果
测试结果按从快到慢排序,可以看到 Node.js 在解释型的语言里面性能还是很不错的,但是和编译型语言相比还是有很大差距的。
语言 | 最快执行时间 |
---|---|
rust | 0.15s user 0.06s system 129% cpu 0.161 total |
java | 0.36s user 0.02s system 89% cpu 0.428 total |
go 编译后 | 0.40s user 0.00s system 99% cpu 0.405 total |
c | 0.49s user 0.00s system 99% cpu 0.492 total |
go | 0.51s user 0.10s system 110% cpu 0.558 total |
dart 编译后 | 0.58s user 0.01s system 99% cpu 0.593 total |
swift | 0.57s user 0.13s system 87% cpu 0.802 total |
rust 编译后 | 0.71s user 0.00s system 99% cpu 0.715 total |
dart | 0.63s user 0.06s system 125% cpu 0.555 total |
nodejs | 1.17s user 0.01s system 99% cpu 1.182 total |
swift 编译后 | 1.47s user 0.00s system 99% cpu 1.479 total |
php | 7.52s user 0.02s system 99% cpu 7.545 total |
python | 14.28s user 0.02s system 99% cpu 14.325 total |
测试结果不代表语言的绝对性能差异
上面的结果仅供参考,不同的机器、不同的编译器、不同的代码,结果可能会有很大差异。
4. 测试代码
4.1 Node.js
function fib(n) {
if (n < 2) {
return 1;
}
return fib(n - 1) + fib(n - 2);
}
console.log(fib(40));
4.2 Java
class Fib{
public static void main(String[] args){
System.out.println(Fib.fib(40));
}
static int fib(int n){
if(n < 2){
return n;
}
return fib(n-1) + fib(n-2);
}
}
4.3 C 语言
#include <stdio.h>
int fib(int n){
if(n < 2){
return n;
}
return fib(n-1) + fib(n-2);
}
int main(){
printf("%d\n",fib(40));
return 0;
}
4.4 Go
package main
import "fmt"
func fib(n int) int {
if n < 2 {
return n
}
return fib(n-1) + fib(n-2)
}
func main(){
fmt.Println(fib(40))
}
4.5 Python
def fib(n):
if n < 2:
return n
return fib(n - 1) + fib(n - 2)
print(fib(40))
4.6 Swift
import Cocoa
func fib(n: Int) -> Int {
if n < 2 {
return n
}
return fib(n: n-1) + fib(n: n-2)
}
print(fib(n: 40))
4.7 PHP
<?php
function fib($n){
if($n < 2){
return $n;
}
return fib($n-1) + fib($n-2);
}
echo fib(40);
echo "\n";
4.8 Dart
int fib(int n){
if(n < 2) {
return n;
}
return fib(n-1) + fib(n-2);
}
main(){
print(fib(40));
}
4.9 Rust
fn fib(n: i64) -> i64 {
if n < 2 {
return n;
}
return fib(n - 1) + fib(n - 2);
}
fn main() {
println!("{}", fib(40));
}
参考文档
该内容为何方原创,转载请注明本页地址
https://iamhefang.cn/tutorials/nodejs/vs-other-languages