diff --git a/instant-xml/Cargo.toml b/instant-xml/Cargo.toml index 32d6c15..da019f0 100644 --- a/instant-xml/Cargo.toml +++ b/instant-xml/Cargo.toml @@ -13,4 +13,9 @@ thiserror = "1.0.29" xmlparser = "0.13.3" [dev-dependencies] +bencher = "0.1.5" similar-asserts = "1.4.2" + +[[bench]] +name = "decode" +harness = false diff --git a/instant-xml/benches/decode.rs b/instant-xml/benches/decode.rs new file mode 100644 index 0000000..e35c0ae --- /dev/null +++ b/instant-xml/benches/decode.rs @@ -0,0 +1,65 @@ +use std::borrow::Cow; + +use bencher::Bencher; +use bencher::{benchmark_group, benchmark_main}; +use instant_xml::{from_str, FromXml}; + +fn decode_short_ascii(bench: &mut Bencher) { + let xml = "foobar"; + bench.iter(|| { + from_str::(xml).unwrap(); + }) +} + +fn decode_longer_ascii(bench: &mut Bencher) { + let mut xml = String::with_capacity(4096); + xml.push_str(""); + for _ in 0..64 { + xml.push_str("abcdefghijklmnopqrstuvwxyz"); + xml.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + xml.push_str("0123456789"); + } + xml.push_str(""); + + bench.iter(|| { + from_str::(&xml).unwrap(); + }) +} + +fn decode_short_escaped(bench: &mut Bencher) { + let xml = "foo & bar"; + bench.iter(|| { + from_str::(xml).unwrap(); + }) +} + +fn decode_longer_escaped(bench: &mut Bencher) { + let mut xml = String::with_capacity(4096); + xml.push_str(""); + for _ in 0..64 { + xml.push_str("abcdefghijklmnopqrstuvwxyz"); + xml.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + xml.push_str("0123456789"); + xml.push_str("""); + } + xml.push_str(""); + + bench.iter(|| { + from_str::(&xml).unwrap(); + }) +} + +#[derive(Debug, FromXml)] +struct Element<'a> { + #[allow(dead_code)] + inner: Cow<'a, str>, +} + +benchmark_group!( + benches, + decode_short_ascii, + decode_longer_ascii, + decode_short_escaped, + decode_longer_escaped, +); +benchmark_main!(benches);