Skip to content

Commit 325b7e5

Browse files
committed
perf(lib): improve parsing by using uninitialized httparse header array
1 parent fdcd2a4 commit 325b7e5

File tree

1 file changed

+10
-10
lines changed

1 file changed

+10
-10
lines changed

src/proto/h1/role.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::fmt::{self, Write};
2+
use std::mem;
23

34
use bytes::{BytesMut, Bytes};
45
use http::header::{CONTENT_LENGTH, DATE, Entry, HeaderName, HeaderValue, TRANSFER_ENCODING};
@@ -32,12 +33,13 @@ where
3233
if buf.len() == 0 {
3334
return Ok(None);
3435
}
35-
let mut headers_indices = [HeaderIndices {
36-
name: (0, 0),
37-
value: (0, 0)
38-
}; MAX_HEADERS];
36+
// Unsafe: both headers_indices and headers are using unitialized memory,
37+
// but we *never* read any of it until after httparse has assigned
38+
// values into it. By not zeroing out the stack memory, this saves
39+
// a good ~5% on pipeline benchmarks.
40+
let mut headers_indices: [HeaderIndices; MAX_HEADERS] = unsafe { mem::uninitialized() };
3941
let (len, method, path, version, headers_len) = {
40-
let mut headers = [httparse::EMPTY_HEADER; MAX_HEADERS];
42+
let mut headers: [httparse::Header; MAX_HEADERS] = unsafe { mem::uninitialized() };
4143
trace!("Request.parse([Header; {}], [u8; {}])", headers.len(), buf.len());
4244
let mut req = httparse::Request::new(&mut headers);
4345
match req.parse(&buf)? {
@@ -262,12 +264,10 @@ where
262264
if buf.len() == 0 {
263265
return Ok(None);
264266
}
265-
let mut headers_indices = [HeaderIndices {
266-
name: (0, 0),
267-
value: (0, 0)
268-
}; MAX_HEADERS];
267+
// Unsafe: see comment in Server Http1Transaction, above.
268+
let mut headers_indices: [HeaderIndices; MAX_HEADERS] = unsafe { mem::uninitialized() };
269269
let (len, status, version, headers_len) = {
270-
let mut headers = [httparse::EMPTY_HEADER; MAX_HEADERS];
270+
let mut headers: [httparse::Header; MAX_HEADERS] = unsafe { mem::uninitialized() };
271271
trace!("Response.parse([Header; {}], [u8; {}])", headers.len(), buf.len());
272272
let mut res = httparse::Response::new(&mut headers);
273273
let bytes = buf.as_ref();

0 commit comments

Comments
 (0)