Skip to content

Commit 51cdbea

Browse files
committed
test(benches): add end-to-end chunked benchmarks
1 parent 4179297 commit 51cdbea

File tree

1 file changed

+60
-7
lines changed

1 file changed

+60
-7
lines changed

benches/end_to_end.rs

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,16 @@ fn http1_parallel_x10_req_10mb(b: &mut test::Bencher) {
6464
.bench(b)
6565
}
6666

67+
#[bench]
68+
fn http1_parallel_x10_req_10kb_100_chunks(b: &mut test::Bencher) {
69+
let body = &[b'x'; 1024 * 10];
70+
opts()
71+
.parallel(10)
72+
.method(Method::POST)
73+
.request_chunks(body, 100)
74+
.bench(b)
75+
}
76+
6777
#[bench]
6878
fn http1_parallel_x10_res_1mb(b: &mut test::Bencher) {
6979
let body = &[b'x'; 1024 * 1024 * 1];
@@ -128,8 +138,21 @@ fn http2_parallel_x10_req_10mb(b: &mut test::Bencher) {
128138
.parallel(10)
129139
.method(Method::POST)
130140
.request_body(body)
131-
//.http2_stream_window(HTTP2_MAX_WINDOW)
132-
//.http2_conn_window(HTTP2_MAX_WINDOW)
141+
.http2_stream_window(HTTP2_MAX_WINDOW)
142+
.http2_conn_window(HTTP2_MAX_WINDOW)
143+
.bench(b)
144+
}
145+
146+
#[bench]
147+
fn http2_parallel_x10_req_10kb_100_chunks(b: &mut test::Bencher) {
148+
let body = &[b'x'; 1024 * 10];
149+
opts()
150+
.http2()
151+
.parallel(10)
152+
.method(Method::POST)
153+
.request_chunks(body, 100)
154+
.http2_stream_window(HTTP2_MAX_WINDOW)
155+
.http2_conn_window(HTTP2_MAX_WINDOW)
133156
.bench(b)
134157
}
135158

@@ -166,6 +189,7 @@ struct Opts {
166189
parallel_cnt: u32,
167190
request_method: Method,
168191
request_body: Option<&'static [u8]>,
192+
request_chunks: usize,
169193
response_body: &'static [u8],
170194
}
171195

@@ -177,6 +201,7 @@ fn opts() -> Opts {
177201
parallel_cnt: 1,
178202
request_method: Method::GET,
179203
request_body: None,
204+
request_chunks: 0,
180205
response_body: b"Hello",
181206
}
182207
}
@@ -207,6 +232,13 @@ impl Opts {
207232
self
208233
}
209234

235+
fn request_chunks(mut self, chunk: &'static [u8], cnt: usize) -> Self {
236+
assert!(cnt > 0);
237+
self.request_body = Some(chunk);
238+
self.request_chunks = cnt;
239+
self
240+
}
241+
210242
fn response_body(mut self, body: &'static [u8]) -> Self {
211243
self.response_body = body;
212244
self
@@ -222,8 +254,16 @@ impl Opts {
222254
let _ = pretty_env_logger::try_init();
223255
// Create a runtime of current thread.
224256
let mut rt = Runtime::new().unwrap();
257+
let exec = rt.handle();
225258

226-
b.bytes = self.response_body.len() as u64 + self.request_body.map(|b| b.len()).unwrap_or(0) as u64;
259+
let req_len = self.request_body.map(|b| b.len()).unwrap_or(0) as u64;
260+
let req_len = if self.request_chunks > 0 {
261+
req_len * self.request_chunks as u64
262+
} else {
263+
req_len
264+
};
265+
let bytes_per_iter = (req_len + self.response_body.len() as u64) * self.parallel_cnt as u64;
266+
b.bytes = bytes_per_iter;
227267

228268
let addr = spawn_server(&mut rt, &self);
229269

@@ -237,10 +277,23 @@ impl Opts {
237277
let url: hyper::Uri = format!("http://{}/hello", addr).parse().unwrap();
238278

239279
let make_request = || {
240-
let body = self
241-
.request_body
242-
.map(Body::from)
243-
.unwrap_or_else(|| Body::empty());
280+
let chunk_cnt = self.request_chunks;
281+
let body = if chunk_cnt > 0 {
282+
283+
let (mut tx, body) = Body::channel();
284+
let chunk = self.request_body.expect("request_chunks means request_body");
285+
exec.spawn(async move {
286+
for _ in 0..chunk_cnt {
287+
tx.send_data(chunk.into()).await.expect("send_data");
288+
}
289+
}).expect("body tx spawn");
290+
body
291+
} else {
292+
self
293+
.request_body
294+
.map(Body::from)
295+
.unwrap_or_else(|| Body::empty())
296+
};
244297
let mut req = Request::new(body);
245298
*req.method_mut() = self.request_method.clone();
246299
*req.uri_mut() = url.clone();

0 commit comments

Comments
 (0)