test(header): add ContentType to server encode benchmark

This commit is contained in:
Sean McArthur
2017-06-22 12:25:41 -07:00
parent 845d742a21
commit 45ce625bda
2 changed files with 24 additions and 9 deletions

View File

@@ -202,8 +202,8 @@ impl<'a, 'b> Formatter<'a, 'b> {
pub fn fmt_line(&mut self, line: &fmt::Display) -> fmt::Result { pub fn fmt_line(&mut self, line: &fmt::Display) -> fmt::Result {
use std::fmt::Write; use std::fmt::Write;
match self.0 { match self.0 {
Multi::Line(ref name, ref mut f) => { Multi::Line(name, ref mut f) => {
try!(f.write_str(*name)); try!(f.write_str(name));
try!(f.write_str(": ")); try!(f.write_str(": "));
try!(write!(NewlineReplacer(*f), "{}", line)); try!(write!(NewlineReplacer(*f), "{}", line));
f.write_str("\r\n") 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); struct NewlineReplacer<'a, F: fmt::Write + 'a>(&'a mut F);
impl<'a, F: fmt::Write + 'a> fmt::Write for NewlineReplacer<'a, F> { impl<'a, F: fmt::Write + 'a> fmt::Write for NewlineReplacer<'a, F> {
#[inline]
fn write_str(&mut self, s: &str) -> fmt::Result { fn write_str(&mut self, s: &str) -> fmt::Result {
let mut since = 0; let mut since = 0;
for (i, &byte) in s.as_bytes().iter().enumerate() { 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(()) Ok(())
} }
} }
#[inline]
fn write_fmt(&mut self, args: fmt::Arguments) -> fmt::Result {
fmt::write(self, args)
}
} }
@@ -539,6 +545,7 @@ impl PartialEq for Headers {
} }
impl fmt::Display for Headers { impl fmt::Display for Headers {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
for header in self.iter() { for header in self.iter() {
try!(fmt::Display::fmt(&header, f)); try!(fmt::Display::fmt(&header, f));
@@ -548,6 +555,7 @@ impl fmt::Display for Headers {
} }
impl fmt::Debug for Headers { impl fmt::Debug for Headers {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_map() f.debug_map()
.entries(self.iter().map(|view| (view.0.as_ref(), ValueString(view.1)))) .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> { impl<'a> fmt::Display for HeaderView<'a> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.1.write_h1(&mut Formatter(Multi::Line(self.0.as_ref(), f))) self.1.write_h1(&mut Formatter(Multi::Line(self.0.as_ref(), f)))
} }
} }
impl<'a> fmt::Debug for HeaderView<'a> { impl<'a> fmt::Debug for HeaderView<'a> {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(self, f) fmt::Display::fmt(self, f)
} }
@@ -659,8 +669,9 @@ impl<'a> FromIterator<HeaderView<'a>> for Headers {
struct HeaderName(Ascii<Cow<'static, str>>); struct HeaderName(Ascii<Cow<'static, str>>);
impl fmt::Display for HeaderName { impl fmt::Display for HeaderName {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(&self.0, f) fmt::Display::fmt(self.0.as_ref(), f)
} }
} }

View File

@@ -110,7 +110,6 @@ impl Http1Transaction for ServerTransaction {
Encoder::chunked() Encoder::chunked()
}; };
let init_cap = 30 + head.headers.len() * AVERAGE_HEADER_SIZE; let init_cap = 30 + head.headers.len() * AVERAGE_HEADER_SIZE;
dst.reserve(init_cap); dst.reserve(init_cap);
debug!("writing headers = {:?}", head.headers); debug!("writing headers = {:?}", head.headers);
@@ -311,11 +310,13 @@ impl<'a> Iterator for HeadersAsBytesIter<'a> {
struct FastWrite<'a>(&'a mut Vec<u8>); struct FastWrite<'a>(&'a mut Vec<u8>);
impl<'a> fmt::Write for FastWrite<'a> { impl<'a> fmt::Write for FastWrite<'a> {
#[inline]
fn write_str(&mut self, s: &str) -> fmt::Result { fn write_str(&mut self, s: &str) -> fmt::Result {
extend(self.0, s.as_bytes()); extend(self.0, s.as_bytes());
Ok(()) Ok(())
} }
#[inline]
fn write_fmt(&mut self, args: fmt::Arguments) -> fmt::Result { fn write_fmt(&mut self, args: fmt::Arguments) -> fmt::Result {
fmt::write(self, args) fmt::write(self, args)
} }
@@ -424,21 +425,24 @@ mod tests {
#[bench] #[bench]
fn bench_server_transaction_encode(b: &mut Bencher) { fn bench_server_transaction_encode(b: &mut Bencher) {
use ::http::MessageHead; use ::http::MessageHead;
use ::header::{Headers, ContentLength}; use ::header::{Headers, ContentLength, ContentType};
use ::{StatusCode, HttpVersion}; use ::{StatusCode, HttpVersion};
b.bytes = 75;
let len = 108;
b.bytes = len as u64;
let mut head = MessageHead { let mut head = MessageHead {
subject: StatusCode::Ok, subject: StatusCode::Ok,
headers: Headers::new(), headers: Headers::new(),
version: HttpVersion::Http11, version: HttpVersion::Http11,
}; };
head.headers.set(ContentLength(0)); head.headers.set(ContentLength(10));
head.headers.set(ContentType::json());
b.iter(|| { b.iter(|| {
let mut vec = Vec::new(); let mut vec = Vec::new();
ServerTransaction::encode(head.clone(), &mut vec); ServerTransaction::encode(head.clone(), &mut vec);
assert_eq!(vec.len(), 75); assert_eq!(vec.len(), len);
::test::black_box(vec); ::test::black_box(vec);
}) })
} }