From 45ce625bdaac28b9c7d67e2daee89329b18298ad Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Thu, 22 Jun 2017 12:25:41 -0700 Subject: [PATCH] test(header): add ContentType to server encode benchmark --- src/header/mod.rs | 19 +++++++++++++++---- src/http/h1/parse.rs | 14 +++++++++----- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/header/mod.rs b/src/header/mod.rs index 9bc3fea3..dfe96ec6 100644 --- a/src/header/mod.rs +++ b/src/header/mod.rs @@ -202,8 +202,8 @@ impl<'a, 'b> Formatter<'a, 'b> { pub fn fmt_line(&mut self, line: &fmt::Display) -> fmt::Result { use std::fmt::Write; match self.0 { - Multi::Line(ref name, ref mut f) => { - try!(f.write_str(*name)); + Multi::Line(name, ref mut f) => { + try!(f.write_str(name)); try!(f.write_str(": ")); try!(write!(NewlineReplacer(*f), "{}", line)); f.write_str("\r\n") @@ -256,6 +256,7 @@ impl<'a, H: Header> fmt::Debug for HeaderValueString<'a, H> { struct NewlineReplacer<'a, F: fmt::Write + 'a>(&'a mut F); impl<'a, F: fmt::Write + 'a> fmt::Write for NewlineReplacer<'a, F> { + #[inline] fn write_str(&mut self, s: &str) -> fmt::Result { let mut since = 0; for (i, &byte) in s.as_bytes().iter().enumerate() { @@ -271,6 +272,11 @@ impl<'a, F: fmt::Write + 'a> fmt::Write for NewlineReplacer<'a, F> { Ok(()) } } + + #[inline] + fn write_fmt(&mut self, args: fmt::Arguments) -> fmt::Result { + fmt::write(self, args) + } } @@ -539,7 +545,8 @@ impl PartialEq for Headers { } impl fmt::Display for Headers { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + #[inline] + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { for header in self.iter() { try!(fmt::Display::fmt(&header, f)); } @@ -548,6 +555,7 @@ impl fmt::Display for Headers { } impl fmt::Debug for Headers { + #[inline] fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_map() .entries(self.iter().map(|view| (view.0.as_ref(), ValueString(view.1)))) @@ -610,12 +618,14 @@ impl<'a> HeaderView<'a> { } impl<'a> fmt::Display for HeaderView<'a> { + #[inline] fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { self.1.write_h1(&mut Formatter(Multi::Line(self.0.as_ref(), f))) } } impl<'a> fmt::Debug for HeaderView<'a> { + #[inline] fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fmt::Display::fmt(self, f) } @@ -659,8 +669,9 @@ impl<'a> FromIterator> for Headers { struct HeaderName(Ascii>); impl fmt::Display for HeaderName { + #[inline] fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - fmt::Display::fmt(&self.0, f) + fmt::Display::fmt(self.0.as_ref(), f) } } diff --git a/src/http/h1/parse.rs b/src/http/h1/parse.rs index 197f5a1c..d2195c0f 100644 --- a/src/http/h1/parse.rs +++ b/src/http/h1/parse.rs @@ -110,7 +110,6 @@ impl Http1Transaction for ServerTransaction { Encoder::chunked() }; - let init_cap = 30 + head.headers.len() * AVERAGE_HEADER_SIZE; dst.reserve(init_cap); debug!("writing headers = {:?}", head.headers); @@ -311,11 +310,13 @@ impl<'a> Iterator for HeadersAsBytesIter<'a> { struct FastWrite<'a>(&'a mut Vec); impl<'a> fmt::Write for FastWrite<'a> { + #[inline] fn write_str(&mut self, s: &str) -> fmt::Result { extend(self.0, s.as_bytes()); Ok(()) } + #[inline] fn write_fmt(&mut self, args: fmt::Arguments) -> fmt::Result { fmt::write(self, args) } @@ -424,21 +425,24 @@ mod tests { #[bench] fn bench_server_transaction_encode(b: &mut Bencher) { use ::http::MessageHead; - use ::header::{Headers, ContentLength}; + use ::header::{Headers, ContentLength, ContentType}; use ::{StatusCode, HttpVersion}; - b.bytes = 75; + + let len = 108; + b.bytes = len as u64; let mut head = MessageHead { subject: StatusCode::Ok, headers: Headers::new(), version: HttpVersion::Http11, }; - head.headers.set(ContentLength(0)); + head.headers.set(ContentLength(10)); + head.headers.set(ContentType::json()); b.iter(|| { let mut vec = Vec::new(); ServerTransaction::encode(head.clone(), &mut vec); - assert_eq!(vec.len(), 75); + assert_eq!(vec.len(), len); ::test::black_box(vec); }) }