В этой статье я собираюсь сравнить собственный HTTP-сервер Deno с Hyper HTTP-сервером Rust. Основываясь на своих исследованиях, я обнаружил, что Hyper - самый популярный сервер на стороне Rust. Если есть лучшие и популярные альтернативы, пожалуйста, дайте мне знать.
Это сравнение интересно, поскольку сам Deno написан на Rust. Сравнение может не иметь особого смысла, потому что Rust должен легко превзойти Deno. Основное отличие заключается в том, что Deno использует другой HTTP-сервер под названием flash. Давайте проведем тесты и проверим результаты.
Тестовая настройка
Тесты выполняются на MacBook Pro M1 с 16 ГБ оперативной памяти.
Версии программного обеспечения следующие:
- Deno v1.32.3
- Rust v1.68.2
Deno
Deno.serve((_) => new Response("Hello world!"), {
port: 3000,
});
Rust
use std::convert::Infallible;
use std::net::SocketAddr;
use bytes::Bytes;
use http_body_util::Full;
use hyper::server::conn::http1;
use hyper::service::service_fn;
use hyper::{Request, Response};
use tokio::net::TcpListener;
async fn hello(_: Request<hyper::body::Incoming>) -> Result<Response<Full<Bytes>>, Infallible> {
let response = Response::builder()
.header("Content-type", "text/plain")
.body(Full::new(Bytes::from("Hello World!")))
.unwrap();
Ok(response)
}
#[tokio::main]
pub async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let addr: SocketAddr = ([127, 0, 0, 1], 3000).into();
let listener = TcpListener::bind(addr).await?;
loop {
let (stream, _) = listener.accept().await?;
tokio::task::spawn(async move {
if let Err(err) = http1::Builder::new()
.serve_connection(stream, service_fn(hello)).await {
println!("Error serving connection: {:?}", err);
}
});
}
}
Cargo.toml
[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"
[dependencies]
bytes = "1"
hyper = { version = "1.0.0-rc.3", features = ["full"] }
tokio = { version = "1", features = ["full"] }
http-body-util = "0.1.0-rc.2"
Код Rust был собран в режиме выпуска:
> cargo build --release
...
Compiling hyper v1.0.0-rc.3
Compiling hello_world v0.1.0 (/Users/mayankc/Work/source/perfComparisons/rust)
Finished release [optimized] target(s) in 19.88s
Тестирование
Каждый тест выполняется для 5 миллионов запросов.
Тесты выполняются для 10, 100 и 300 одновременных подключений.
Нагрузочный тест выполняется с помощью инструмента HTTP-тестирования Bombardier.
Ниже приведены таблицы, показывающие результаты для каждого уровня параллелизма:
Анализ
Я очень удивлен результатами. Deno довольно хорошо противостоит могучему Rust. При низком уровне параллелизма показатели RPS и задержки почти одинаковы. Существенная разница заключается в использовании памяти, где Rust почти ничего не использует. При высоком уровне параллелизма Rust предлагает 173K, в то время как Deno предлагает 165K. Это не такая уж большая разница. Загрузка процессора Deno меньше, в то время как использование памяти Rust очень низкое.
ПОБЕДИТЕЛЬ: Трудно сказать, но я выберу Rust Hyper