Перейти к содержанию

Bun vs Rust Hyper - сравнение производительности HTTP-сервера Hello world

Posted on:10 апреля 2023 г. at 12:04

Example Dynamic OG Image link В этой статье я собираюсь сравнить собственный HTTP-сервер Bun с Hyper HTTP-сервером Rust. Основываясь на своих исследованиях, я обнаружил, что Hyper - самый популярный сервер на стороне Rust. Если есть лучшие и популярные альтернативы, пожалуйста, дайте мне знать.

Сравнение может не иметь особого смысла, потому что Rust должен легко превзойти интерпретируемую среду выполнения, такую как Bun. Давайте проведем тесты и проверим результаты.

Тестовая настройка

Версии программного обеспечения следующие:

Код HTTP-сервера hello world в обоих случаях выглядит следующим образом:

Bun

Bun.serve({
  port: 3000,
  fetch(_) {
    return new Response("Hello world!");
  },
});

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.

Ниже приведены таблицы, показывающие результаты для каждого уровня параллелизма:

Анализ

Что ж, у этого есть шанс стать предметом обсуждения. Bun превосходит Rust по большинству показателей.

ПОБЕДИТЕЛЬ: Bun