跳到主要内容

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 在解释型的语言里面性能还是很不错的,但是和编译型语言相比还是有很大差距的。

语言最快执行时间
rust0.15s user 0.06s system 129% cpu 0.161 total
java0.36s user 0.02s system 89% cpu 0.428 total
go 编译后0.40s user 0.00s system 99% cpu 0.405 total
c0.49s user 0.00s system 99% cpu 0.492 total
go0.51s user 0.10s system 110% cpu 0.558 total
dart 编译后0.58s user 0.01s system 99% cpu 0.593 total
swift0.57s user 0.13s system 87% cpu 0.802 total
rust 编译后0.71s user 0.00s system 99% cpu 0.715 total
dart0.63s user 0.06s system 125% cpu 0.555 total
nodejs1.17s user 0.01s system 99% cpu 1.182 total
swift 编译后1.47s user 0.00s system 99% cpu 1.479 total
php7.52s user 0.02s system 99% cpu 7.545 total
python14.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));
}

参考文档

  1. 斐波那契数
  2. Dart
  3. GoLang
该内容为何方原创,转载请注明本页地址
https://iamhefang.cn/tutorials/nodejs/vs-other-languages