diff --git a/src/header/common/accept.rs b/src/header/common/accept.rs index 0fcb1819..0afa8f70 100644 --- a/src/header/common/accept.rs +++ b/src/header/common/accept.rs @@ -65,3 +65,5 @@ impl HeaderFormat for Accept { } } +bench_header!(bench, Accept, { vec![b"text/plain; q=0.5, text/html".to_vec()] }) + diff --git a/src/header/common/authorization.rs b/src/header/common/authorization.rs index 7cc13334..f71a4cab 100644 --- a/src/header/common/authorization.rs +++ b/src/header/common/authorization.rs @@ -178,3 +178,6 @@ mod tests { } } + +bench_header!(raw, Authorization, { vec![b"foo bar baz".to_vec()] }) +bench_header!(basic, Authorization, { vec![b"Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==".to_vec()] }) diff --git a/src/header/common/connection.rs b/src/header/common/connection.rs index 6e5b5205..98e29b63 100644 --- a/src/header/common/connection.rs +++ b/src/header/common/connection.rs @@ -62,3 +62,6 @@ impl HeaderFormat for Connection { } } +bench_header!(close, Connection, { vec![b"close".to_vec()] }) +bench_header!(keep_alive, Connection, { vec![b"keep-alive".to_vec()] }) +bench_header!(header, Connection, { vec![b"authorization".to_vec()] }) diff --git a/src/header/common/content_length.rs b/src/header/common/content_length.rs index 8e553b33..b1895c60 100644 --- a/src/header/common/content_length.rs +++ b/src/header/common/content_length.rs @@ -34,3 +34,5 @@ impl ContentLength { len } } + +bench_header!(bench, ContentLength, { vec![b"42349984".to_vec()] }) diff --git a/src/header/common/content_type.rs b/src/header/common/content_type.rs index 01c830b3..2a664d97 100644 --- a/src/header/common/content_type.rs +++ b/src/header/common/content_type.rs @@ -27,3 +27,4 @@ impl HeaderFormat for ContentType { } } +bench_header!(bench, ContentType, { vec![b"application/json; charset=utf-8".to_vec()] }) diff --git a/src/header/common/cookie.rs b/src/header/common/cookie.rs index 53228131..7974a4c0 100644 --- a/src/header/common/cookie.rs +++ b/src/header/common/cookie.rs @@ -94,3 +94,5 @@ fn test_fmt() { assert_eq!(headers.to_string()[], "Cookie: foo=bar; baz=quux\r\n"); } + +bench_header!(bench, Cookies, { vec![b"foo=bar; baz=quux".to_vec()] }) diff --git a/src/header/common/date.rs b/src/header/common/date.rs index 91d18f38..dc4d59cb 100644 --- a/src/header/common/date.rs +++ b/src/header/common/date.rs @@ -69,3 +69,7 @@ impl FromStr for Date { } } +bench_header!(imf_fixdate, Date, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] }) +bench_header!(rfc_850, Date, { vec![b"Sunday, 06-Nov-94 08:49:37 GMT".to_vec()] }) +bench_header!(asctime, Date, { vec![b"Sun Nov 6 08:49:37 1994".to_vec()] }) + diff --git a/src/header/common/host.rs b/src/header/common/host.rs index 5b40a9e4..f4753996 100644 --- a/src/header/common/host.rs +++ b/src/header/common/host.rs @@ -94,3 +94,6 @@ mod tests { })); } } + +bench_header!(bench, Host, { vec![b"foo.com:3000".to_vec()] }) + diff --git a/src/header/common/location.rs b/src/header/common/location.rs index 8864353b..e266e607 100644 --- a/src/header/common/location.rs +++ b/src/header/common/location.rs @@ -33,3 +33,5 @@ impl HeaderFormat for Location { } } +bench_header!(bench, Location, { vec![b"http://foo.com/hello:3000".to_vec()] }) + diff --git a/src/header/common/mod.rs b/src/header/common/mod.rs index 0120a776..c7013954 100644 --- a/src/header/common/mod.rs +++ b/src/header/common/mod.rs @@ -25,8 +25,47 @@ use std::fmt::{mod, Show}; use std::from_str::FromStr; use std::str::from_utf8; +macro_rules! bench_header( + ($name:ident, $ty:ty, $value:expr) => { + #[cfg(test)] + mod $name { + use test::Bencher; + use std::fmt::{mod, Show}; + + use super::*; + + use header::{Header, HeaderFormat}; + + struct HeaderFormatter($ty); + + impl Show for HeaderFormatter { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.0.fmt_header(f) + } + } + + #[bench] + fn bench_parse(b: &mut Bencher) { + let val = $value; + b.iter(|| { + let _: $ty= Header::parse_header(val[]).unwrap(); + }); + } + + #[bench] + fn bench_format(b: &mut Bencher) { + let val = HeaderFormatter(Header::parse_header($value[]).unwrap()); + b.iter(|| { + format!("{}", val); + }); + } + } + } +) + /// Exposes the Accept header. pub mod accept; + /// Exposes the Authorization header. pub mod authorization; diff --git a/src/header/common/server.rs b/src/header/common/server.rs index f48cbb0b..7e6420c9 100644 --- a/src/header/common/server.rs +++ b/src/header/common/server.rs @@ -25,3 +25,5 @@ impl HeaderFormat for Server { } } +bench_header!(bench, Server, { vec![b"Some String".to_vec()] }) + diff --git a/src/header/common/transfer_encoding.rs b/src/header/common/transfer_encoding.rs index edce4fd2..6f86963a 100644 --- a/src/header/common/transfer_encoding.rs +++ b/src/header/common/transfer_encoding.rs @@ -84,3 +84,6 @@ impl HeaderFormat for TransferEncoding { } } +bench_header!(normal, TransferEncoding, { vec![b"chunked, gzip".to_vec()] }) +bench_header!(ext, TransferEncoding, { vec![b"ext".to_vec()] }) + diff --git a/src/header/common/upgrade.rs b/src/header/common/upgrade.rs index 26c754b0..b64fc9a6 100644 --- a/src/header/common/upgrade.rs +++ b/src/header/common/upgrade.rs @@ -51,3 +51,5 @@ impl HeaderFormat for Upgrade { } } +bench_header!(bench, Upgrade, { vec![b"HTTP/2.0, RTA/x11, websocket".to_vec()] }) + diff --git a/src/header/common/user_agent.rs b/src/header/common/user_agent.rs index a4cd8d6c..225de119 100644 --- a/src/header/common/user_agent.rs +++ b/src/header/common/user_agent.rs @@ -25,3 +25,5 @@ impl HeaderFormat for UserAgent { } } +bench_header!(bench, UserAgent, { vec![b"cargo bench".to_vec()] }) +