From 5b870c05b71e07e8b86845f95fa6247ce84a10f8 Mon Sep 17 00:00:00 2001 From: Maksym Vorobiov Date: Tue, 21 Jan 2020 13:12:23 +0200 Subject: [PATCH] add benchmark for full stack request lifecycle --- Cargo.toml | 5 ++++ benches/server.rs | 66 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 benches/server.rs diff --git a/Cargo.toml b/Cargo.toml index 9e1b559eb..e0be64b1b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -99,6 +99,7 @@ env_logger = "0.6" serde_derive = "1.0" brotli2 = "0.3.2" flate2 = "1.0.13" +criterion = "0.3" [profile.release] lto = true @@ -116,3 +117,7 @@ actix-session = { path = "actix-session" } actix-files = { path = "actix-files" } actix-multipart = { path = "actix-multipart" } awc = { path = "awc" } + +[[bench]] +name = "server" +harness = false \ No newline at end of file diff --git a/benches/server.rs b/benches/server.rs new file mode 100644 index 000000000..a1261a73c --- /dev/null +++ b/benches/server.rs @@ -0,0 +1,66 @@ +use actix_web::{web, test, App, HttpResponse}; +use criterion::{criterion_group, criterion_main, Criterion}; +use futures::future::join_all; +use awc::Client; + +const STR: &str = "Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World \ + Hello World Hello World Hello World Hello World Hello World"; + + +// benchmark sending all requests at the same time +fn bench_async_burst(c: &mut Criterion) { + let srv = test::start(|| { + App::new() + .service(web::resource("/").route(web::to(|| HttpResponse::Ok().body(STR)))) + }); + + // We are using System here, since Runtime requires preinitialized tokio + // Maybe add to actix_rt docs + let url = srv.url("/"); + let mut rt = actix_rt::System::new("test"); + + c.bench_function("get_body_async_burst", move |b| + b.iter_custom(|iters| { + + let client = Client::new().get(url.clone()).freeze().unwrap(); + + let start = std::time::Instant::now(); + // benchmark body + let resps = rt.block_on(async move { + let burst = (0..iters).map( |_| client.send() ); + join_all( burst ).await + }); + let elapsed = start.elapsed(); + + // if there are failed requests that might be an issue + let failed = resps.iter().filter(|r| r.is_err()).count(); + if failed >0 { + eprintln!("failed {} requests (might be bench timeout)", failed); + }; + + elapsed + }) + ); +} + +criterion_group!(server_benches, bench_async_burst); +criterion_main!(server_benches); \ No newline at end of file