Rust 與 Go:基準

https://dev.to/zanepearton/building-a-simple-web-server-rust-vs-go-om5

最近,Rust 和 Go 受到了很多關注。這兩者的優勢究竟在哪裡?我們將在 127.0.0.1 上啟動伺服器並進行比較。

GitHub: 為進行基準測試,這裡提供了簡單的 HTTP 伺服器代碼:

Web 伺服器代碼: 可查看兩種語言的伺服器實現:

Rust: Rust-Serve 代碼
Go: Go-Serve 代碼

📦 使用 WRK 進行基準測試設置

首先,我們需要一個強大的基準測試工具 WRK。如果您像我一樣使用 Mac,您會發現 Homebrew 非常方便。

基準測試工具: 我們使用 WRK,它以卓越的性能聞名,透過 macOS 的 Homebrew 輕鬆設置。

安裝: macOS 用戶可以使用此簡單的 Homebrew 命令來安裝 WRK:

brew install wrk

🔧 設置 Rust Web 伺服器

要使用 Rust,您需要特定的目錄結構才能開始:

| _ Cargo.toml
| _ src
| _ main.rs

一切就緒後,透過 Cargo 啟動伺服器只需敲下一行指令:

cargo build
cargo run

🏗 Rust Web 伺服器代碼

想深入了解嗎?來看看伺服器代碼吧!

Rust: main.rs

// 從 actix_web 框架和標準庫中導入必要的模塊和類型。
use actix_web::{web,App,HttpServer,HttpResponse,Responder,middleware::Logger};
use std::env;

// 將 main 函數標記為`actix_web::main`,以設置異步運行時。
// 此函數將返回一個結果,如果發生錯誤,將包含`std::io::Error`。
#[actix_web::main]
async fn main() -> std::io::Result<()>
{
我們需要在伺服器上編製程式碼
}

Rust: Cargo.toml

[package]
name = “rust_server”
version = “0.1.0”
edition = “2021”

[dependencies]
actix-web = “4.0”
actix-rt = “2.5”
env_logger = “0.9”

[dev-dependencies]
criterion = “0.3”

🔧 設置 Go Web 伺服器

要使用 Go,只需執行以下命令即可輕鬆啟動伺服器:

go run main.go

🏗 Go Web-Server 代碼

有興趣深入了解嗎?來看看伺服器代碼吧!

伺服器代碼

Go: main.go

package main

import (
“fmt”
“log”
“net/http”
“time”
)

…(以下為伺服器代碼的其餘部分)…

🔑 Rust 或 Go: 主要指標

Rust: 指標

wrk -t2 -c100 -d30s –latency http://127.0.0.1:8080
…(以下為 Rust 伺服器的性能指標)…

Go: 指標

wrk -t2 -c100 -d30s –latency http://127.0.0.1:8080
…(以下為 Go 伺服器的性能指標)…

🔍 讓我們比較一下… Rust 還是 Go?

讓我們比較一下 Rust 伺服器和 Go 伺服器的性能:

Rust 伺服器性能:

平均延遲:7.36ms
延遲標準差:5.32ms
最大延遲:68.59ms
每秒請求量:7.54k(平均),12.48k(最大)
延遲分佈:
中位數(50%):5.94ms
第 75 百分位:7.67ms
第 90 百分位:10.77ms
第 99 百分位:33.52ms
總請求數:30.02 秒內的 450,491 個
每秒傳輸的數據:1.63MB

Go 伺服器性能:

平均延遲:3.85ms
延遲標準差:3.72ms
最大延遲:60.31ms
每秒請求量:14.71k(平均),24.66k(最大)
延遲分佈:
中位數(50%):3.14ms
第 75 百分位:3.95ms
第 90 百分位:5.45ms
第 99 百分位:21.33ms
總請求數:30.06 秒內的 879,736 個
每秒傳輸的數據:4.33MB

🤔 啊呀.. 是 Rust 還是 Go?

延遲:與 Rust 伺服器相比,Go 伺服器平均、中位數和第 99 百分位的延遲更低。這表明就單個請求而言,Go 伺服器通常能更快地回應。

每秒請求量(吞吐量):與 Rust 伺服器相比,Go 伺服器處理的請求量幾乎是其兩倍。這表明在測試負載條件下,Go 伺服器的吞吐量更高。

數據傳輸:Go 伺服器每秒傳輸的數據量比 Rust 伺服器更多,這與其較高的每秒請求量相符。

結論:

哎呀.. 在這項基準測試中,Go 伺服器在延遲和吞吐量方面表現優於 Rust 伺服器。不過,在解釋這些結果時需要注意一些關鍵考量:

伺服器配置:伺服器的配置(如使用異步程式碼、線程池大小和其他優化)會對性能產生重大影響。

工作負載特徵:根據伺服器實際執行的任務(靜態文件傳送、數據庫查詢、CPU 密集任務),性能特徵可能會發生變化。

基準測試條件:執行基準測試的系統、其他運行進程、網絡條件,甚至是使用 wrk 的細節都可能影響結果。

程式碼成熟度和優化:正被進行基準測試的特定 Rust 和 Go 程式碼可能處於不同的優化水平。更成熟或優化程式碼的性能可以顯著更好。

如有需要,請提出任何問題。

via DEV Community: javascript

January 17, 2024 at 02:12PM

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *