1. 設置階段:我們的基準方法

在討論結果之前,我們先來了解一下背景。我們的基準測試是在嚴格控制的環境中進行的,以確保公平競爭:

我們通過三個真實場景對每個競爭者進行測試:

我們并沒有就此止步。每個場景都在三個壓力水平下進行了測試:100、1000 和 5000 個并發連接。這就是我們所說的壓力測試!

2. 競爭者

讓我們快速看一下每個競爭者如何實現一個簡單的“Hello, World!” JSON 響應:

2.1 Node.js(帶有 Express 的 v20.x)

const express = require('express');
const app = express();
app.get('/hello', (req, res) => {
res.json({ message: 'Hello, World!' });
});
app.listen(3000);

2.2 Go(v1.21.x)

package main
import (
"encoding/json"
"net/http"
)
func main() {
http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(map[string]string{"message": "Hello, World!"})
})
http.ListenAndServe(":3000", nil)
}

2.3 Rust(使用 Actix-web v4.x)

use actix_web::{web, App, HttpServer, Responder};
async fn hello() -> impl Responder {
web::Json(serde_json::json!({"message": "Hello, World!"}))
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new().service(web::resource("/hello").to(hello))
})
.bind("127.0.0.1:3000")?
.run()
.await
}

2.4 C# (.NET 8)

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/hello", () => Results.Json(new { message = "Hello, World!" }));
app.Run();

3. 結果

現在,就是大家期盼已久的時刻了。讓我們深入了解一下基準測試結果:

場景 1:“Hello, World!” JSON 響應

 Framework | 100 Conn (req/s) | 1000 Conn (req/s) | 5000 Conn (req/s) | Avg Latency (ms) |
|-----------|------------------|-------------------|-------------------|------------------|
| Node.js | 42,000 | 68,000 | 72,000 | 3.2 |
| Go | 78,000 | 125,000 | 132,000 | 1.8 |
| Rust | 95,000 | 158,000 | 165,000 | 1.5 |
| C# (.NET) | 68,000 | 110,000 | 118,000 | 2.1

場景 2:數據庫讀取(單行提取)

 Framework | 100 Conn (req/s) | 1000 Conn (req/s) | 5000 Conn (req/s) | Avg Latency (ms) |
|-----------|------------------|-------------------|-------------------|------------------|
| Node.js | 15,000 | 22,000 | 24,000 | 8.5 |
| Go | 28,000 | 42,000 | 45,000 | 4.8 |
| Rust | 32,000 | 48,000 | 52,000 | 4.2 |
| C# (.NET) | 25,000 | 38,000 | 41,000 | 5.5

場景 3:復雜的 JSON 處理

 Framework | 100 Conn (req/s) | 1000 Conn (req/s) | 5000 Conn (req/s) | Avg Latency (ms) |
|-----------|------------------|-------------------|-------------------|------------------|
| Node.js | 8,000 | 12,000 | 13,000 | 15.8 |
| Go | 18,000 | 28,000 | 30,000 | 7.2 |
| Rust | 22,000 | 34,000 | 36,000 | 6.1 |
| C# (.NET) | 16,000 | 25,000 | 27,000 | 8.4

4. 分析結果

這些數字講述了一個引人入勝的故事,但它們對作為開發人員的您來說真正意味著什么?讓我們來分析一下:

??原始速度:Rust 是這里無可爭議的冠軍,在每種情況下都遠遠超過競爭對手。它就像 Web 服務器中的跑車 — 造型時尚、功能強大、速度極快。

??擴大規模:當我們增加并發連接數時,所有競爭對手都表明他們可以應對高溫。但 Rust 和 Go 呢?他們不僅能應對,而且在壓力下茁壯成長。

??延遲問題:說到保持速度,Rust 再次奪冠,Go 緊隨其后。Node.js 雖然仍然非常快,但在更重的負載下開始感到壓力。

???開發人員體驗:事情從這里開始變得有趣。Node.js 就像您最喜歡的牛仔褲一樣 — 舒適、熟悉且隨時可用。Go 在性能和易用性之間取得了良好的平衡。Rust?這就像學習駕駛噴氣式飛機 — 一開始很難,但一旦掌握它就會變得非常強大。C# 和 .NET 提供了許多開發人員喜愛的強大、功能齊全的體驗。

??最適合場景:

5. 判決結果

那么,您應該選擇哪一個?嗯,這取決于您和您的項目。以下是快速指南:

請記住,這些基準測試僅供參考。您的里程可能會因您的具體用例、架構以及您對應用程序的微調方式而異。最好的建議是什么?運行您自己的基準測試,盡可能接近您的生產環境。

文章轉自微信公眾號@云原生技術愛好者社區

上一篇:

.NET 7.0+WebAPI 后端架構實戰

下一篇:

嵌入式插件的興衰:嵌入式框架的API
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費