Skip to content

Commit d96c5c9

Browse files
committed
Update comparison crate to criterion as well
1 parent e08e490 commit d96c5c9

File tree

3 files changed

+90
-92
lines changed

3 files changed

+90
-92
lines changed

compare/Cargo.toml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,10 @@ edition = "2018"
99
[dev-dependencies]
1010
quick-xml = { path = "..", features = ["serialize"] }
1111
xml-rs = "0.8.0"
12-
serde-xml-rs = "0.4.1"
12+
serde-xml-rs = "0.5.1"
1313
serde = { version = "1.0.103", features = [ "derive" ] }
14+
criterion = "0.3.5"
15+
16+
[[bench]]
17+
name = "bench"
18+
harness = false

compare/benches/bench-serde.rs

Lines changed: 0 additions & 56 deletions
This file was deleted.

compare/benches/bench.rs

Lines changed: 84 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,93 @@
1-
#![feature(test)]
1+
use criterion::{self, criterion_group, criterion_main, Criterion};
2+
use quick_xml::{self, events::Event, Reader};
3+
use serde::Deserialize;
4+
use serde_xml_rs;
5+
use xml::reader::{EventReader, XmlEvent};
26

3-
extern crate quick_xml;
4-
extern crate test;
5-
extern crate xml;
7+
static SOURCE: &str = include_str!("../../tests/sample_rss.xml");
68

7-
use quick_xml::{events::Event, Reader};
8-
use test::Bencher;
9-
use xml::reader::{EventReader, XmlEvent};
9+
fn comparison(c: &mut Criterion) {
10+
let mut group = c.benchmark_group("raw_parse_comparison");
1011

11-
#[bench]
12-
fn bench_quick_xml(b: &mut Bencher) {
13-
let src: &[u8] = include_bytes!("../../tests/sample_rss.xml");
14-
b.iter(|| {
15-
let mut r = Reader::from_reader(src);
16-
r.check_end_names(false).check_comments(false);
17-
let mut count = test::black_box(0);
18-
let mut buf = Vec::new();
19-
loop {
20-
match r.read_event(&mut buf) {
21-
Ok(Event::Start(_)) | Ok(Event::Empty(_)) => count += 1,
22-
Ok(Event::Eof) => break,
23-
_ => (),
12+
group.bench_function("quick_xml_normal", |b| {
13+
b.iter(|| {
14+
let mut r = Reader::from_reader(SOURCE.as_bytes());
15+
r.check_end_names(false).check_comments(false);
16+
let mut count = criterion::black_box(0);
17+
let mut buf = Vec::new();
18+
loop {
19+
match r.read_event(&mut buf) {
20+
Ok(Event::Start(_)) | Ok(Event::Empty(_)) => count += 1,
21+
Ok(Event::Eof) => break,
22+
_ => (),
23+
}
24+
buf.clear();
2425
}
25-
buf.clear();
26-
}
27-
assert_eq!(count, 1550);
26+
assert_eq!(count, 1550);
27+
})
2828
});
29-
}
3029

31-
#[bench]
32-
fn bench_xml_rs(b: &mut Bencher) {
33-
let src: &[u8] = include_bytes!("../../tests/sample_rss.xml");
34-
b.iter(|| {
35-
let r = EventReader::new(src);
36-
let mut count = test::black_box(0);
37-
for e in r {
38-
if let Ok(XmlEvent::StartElement { .. }) = e {
39-
count += 1;
30+
group.bench_function("xml_rs_normal", |b| {
31+
b.iter(|| {
32+
let r = EventReader::new(SOURCE.as_bytes());
33+
let mut count = criterion::black_box(0);
34+
for e in r {
35+
if let Ok(XmlEvent::StartElement { .. }) = e {
36+
count += 1;
37+
}
4038
}
41-
}
42-
assert_eq!(count, 1550);
39+
assert_eq!(count, 1550);
40+
})
4341
});
42+
group.finish();
4443
}
44+
45+
fn serde_comparison(c: &mut Criterion) {
46+
let mut group = c.benchmark_group("serde_parse_comparison");
47+
#[derive(Debug, Deserialize)]
48+
struct Rss {
49+
channel: Channel,
50+
}
51+
52+
#[derive(Debug, Deserialize)]
53+
struct Channel {
54+
title: String,
55+
#[serde(rename = "item", default)]
56+
items: Vec<Item>,
57+
}
58+
59+
#[derive(Debug, Deserialize)]
60+
struct Item {
61+
title: String,
62+
link: String,
63+
#[serde(rename = "pubDate")]
64+
pub_date: String,
65+
enclosure: Option<Enclosure>,
66+
}
67+
68+
#[derive(Debug, Deserialize)]
69+
struct Enclosure {
70+
url: String,
71+
length: String,
72+
#[serde(rename = "type")]
73+
typ: String,
74+
}
75+
76+
group.bench_function("quick_xml_serde", |b| {
77+
b.iter(|| {
78+
let rss: Rss = quick_xml::de::from_str(SOURCE).unwrap();
79+
assert_eq!(rss.channel.items.len(), 99);
80+
})
81+
});
82+
83+
group.bench_function("xml_rs_serde", |b| {
84+
b.iter(|| {
85+
let rss: Rss = serde_xml_rs::from_str(SOURCE).unwrap();
86+
assert_eq!(rss.channel.items.len(), 99);
87+
});
88+
});
89+
group.finish();
90+
}
91+
92+
criterion_group!(benches, comparison, serde_comparison);
93+
criterion_main!(benches);

0 commit comments

Comments
 (0)