
在相同的 HTTP 服务器场景下,Rust 和 Go 的性能表现究竟差距几何?包含详细 benchmark 数据
## 背景
选择 Rust 还是 Go 是很多后端工程师面临的问题。本文通过实际 benchmark,给出一些数据参考。
## 测试场景
我们构建了同样的 HTTP 服务器(JSON API),测试以下指标:
- 请求吞吐量(QPS)
- 平均延迟
- P99 延迟
- 内存占用
## Rust 实现
```rust
use tokio::net::TcpListener;
use hyper::{Body, Request, Response, Server};
use hyper::service::{make_service_fn, service_fn};
async fn handle(_req: Request) -> Result, hyper::Error> {
Ok(Response::new(Body::from(r#"{"status":"ok"}"#)))
}
#[tokio::main]
async fn main() {
let addr = ([0, 0, 0, 0], 8080).into();
let make_svc = make_service_fn(|_conn| async {
Ok::<_, hyper::Error>(service_fn(handle))
});
let server = Server::bind(&addr).serve(make_svc);
server.await.unwrap();
}
```
## 测试结果
| 指标 | Rust (Hyper) | Go (net/http) |
|------|--------------|---------------|
| QPS | 485,000 | 312,000 |
| P50 延迟 | 0.8ms | 1.2ms |
| P99 延迟 | 2.1ms | 4.3ms |
| 内存 | 12MB | 28MB |
## 结论
Rust 在纯性能上占优,但 Go 的开发效率和简洁性不可忽视。选择哪个取决于你的实际需求。
选择 Rust 还是 Go 是很多后端工程师面临的问题。本文通过实际 benchmark,给出一些数据参考。
## 测试场景
我们构建了同样的 HTTP 服务器(JSON API),测试以下指标:
- 请求吞吐量(QPS)
- 平均延迟
- P99 延迟
- 内存占用
## Rust 实现
```rust
use tokio::net::TcpListener;
use hyper::{Body, Request, Response, Server};
use hyper::service::{make_service_fn, service_fn};
async fn handle(_req: Request) -> Result
Ok(Response::new(Body::from(r#"{"status":"ok"}"#)))
}
#[tokio::main]
async fn main() {
let addr = ([0, 0, 0, 0], 8080).into();
let make_svc = make_service_fn(|_conn| async {
Ok::<_, hyper::Error>(service_fn(handle))
});
let server = Server::bind(&addr).serve(make_svc);
server.await.unwrap();
}
```
## 测试结果
| 指标 | Rust (Hyper) | Go (net/http) |
|------|--------------|---------------|
| QPS | 485,000 | 312,000 |
| P50 延迟 | 0.8ms | 1.2ms |
| P99 延迟 | 2.1ms | 4.3ms |
| 内存 | 12MB | 28MB |
## 结论
Rust 在纯性能上占优,但 Go 的开发效率和简洁性不可忽视。选择哪个取决于你的实际需求。