Skip to content

Commit e9ccf28

Browse files
committed
compare: Put each group into its own file to be able to run them independently using cargo bench --bench <group>
1 parent 6ad3201 commit e9ccf28

File tree

3 files changed

+95
-82
lines changed

3 files changed

+95
-82
lines changed

compare/Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,9 @@ serde_derive = "1.0"
2929
pretty_assertions = "1.4"
3030

3131
[[bench]]
32-
name = "bench"
32+
name = "low-level"
33+
harness = false
34+
35+
[[bench]]
36+
name = "serde"
3337
harness = false

compare/benches/bench.rs renamed to compare/benches/low-level.rs

Lines changed: 1 addition & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ use criterion::{self, criterion_group, criterion_main, BenchmarkId, Criterion, T
22
use pretty_assertions::assert_eq;
33
use quick_xml::events::Event;
44
use quick_xml::reader::Reader;
5-
use serde::Deserialize;
6-
use serde_xml_rs;
75
use std::hint::black_box;
86
use xml::reader::{EventReader, XmlEvent};
97

@@ -283,83 +281,5 @@ fn low_level_comparison(c: &mut Criterion) {
283281
group.finish();
284282
}
285283

286-
/// Runs benchmarks for several XML libraries using serde deserialization
287-
#[allow(dead_code)] // We do not use structs
288-
fn serde_comparison(c: &mut Criterion) {
289-
let mut group = c.benchmark_group("serde");
290-
291-
#[derive(Debug, Deserialize)]
292-
struct Rss<E> {
293-
channel: Channel<E>,
294-
}
295-
296-
#[derive(Debug, Deserialize)]
297-
struct Channel<E> {
298-
title: String,
299-
#[serde(rename = "item", default = "Vec::new")]
300-
items: Vec<Item<E>>,
301-
}
302-
303-
#[derive(Debug, Deserialize)]
304-
struct Item<E> {
305-
title: String,
306-
link: String,
307-
#[serde(rename = "pubDate")]
308-
pub_date: String,
309-
enclosure: Option<E>,
310-
}
311-
312-
#[derive(Debug, Deserialize)]
313-
struct Enclosure {
314-
#[serde(rename = "@url")]
315-
url: String,
316-
317-
#[serde(rename = "@length")]
318-
length: String,
319-
320-
#[serde(rename = "@type")]
321-
typ: String,
322-
}
323-
324-
group.throughput(Throughput::Bytes(SAMPLE_RSS.len() as u64));
325-
326-
group.bench_with_input(
327-
BenchmarkId::new("quick_xml", "sample_rss.xml"),
328-
SAMPLE_RSS,
329-
|b, input| {
330-
b.iter(|| {
331-
let rss: Rss<Enclosure> = black_box(quick_xml::de::from_str(input).unwrap());
332-
assert_eq!(rss.channel.items.len(), 99);
333-
})
334-
},
335-
);
336-
337-
/* NOTE: Most parts of deserializer are not implemented yet, so benchmark failed
338-
group.bench_with_input(BenchmarkId::new("rapid-xml", "sample_rss.xml"), SAMPLE_RSS, |b, input| {
339-
use rapid_xml::de::Deserializer;
340-
use rapid_xml::parser::Parser;
341-
342-
b.iter(|| {
343-
let mut r = Parser::new(input.as_bytes());
344-
let mut de = Deserializer::new(&mut r).unwrap();
345-
let rss = black_box(Rss::deserialize(&mut de).unwrap());
346-
assert_eq!(rss.channel.items.len(), 99);
347-
});
348-
});*/
349-
350-
group.bench_with_input(
351-
BenchmarkId::new("xml_rs", "sample_rss.xml"),
352-
SAMPLE_RSS,
353-
|b, input| {
354-
b.iter(|| {
355-
let rss: Rss<Enclosure> = black_box(serde_xml_rs::from_str(input).unwrap());
356-
assert_eq!(rss.channel.items.len(), 99);
357-
})
358-
},
359-
);
360-
361-
group.finish();
362-
}
363-
364-
criterion_group!(benches, low_level_comparison, serde_comparison);
284+
criterion_group!(benches, low_level_comparison);
365285
criterion_main!(benches);

compare/benches/serde.rs

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
use criterion::{self, criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
2+
use pretty_assertions::assert_eq;
3+
use serde::Deserialize;
4+
use serde_xml_rs;
5+
use std::hint::black_box;
6+
7+
static SAMPLE_RSS: &str = include_str!("../../tests/documents/sample_rss.xml");
8+
9+
/// Runs benchmarks for several XML libraries using serde deserialization
10+
#[allow(dead_code)] // We do not use structs
11+
fn serde_comparison(c: &mut Criterion) {
12+
let mut group = c.benchmark_group("serde");
13+
14+
#[derive(Debug, Deserialize)]
15+
struct Rss<E> {
16+
channel: Channel<E>,
17+
}
18+
19+
#[derive(Debug, Deserialize)]
20+
struct Channel<E> {
21+
title: String,
22+
#[serde(rename = "item", default = "Vec::new")]
23+
items: Vec<Item<E>>,
24+
}
25+
26+
#[derive(Debug, Deserialize)]
27+
struct Item<E> {
28+
title: String,
29+
link: String,
30+
#[serde(rename = "pubDate")]
31+
pub_date: String,
32+
enclosure: Option<E>,
33+
}
34+
35+
#[derive(Debug, Deserialize)]
36+
struct Enclosure {
37+
#[serde(rename = "@url")]
38+
url: String,
39+
40+
#[serde(rename = "@length")]
41+
length: String,
42+
43+
#[serde(rename = "@type")]
44+
typ: String,
45+
}
46+
47+
group.throughput(Throughput::Bytes(SAMPLE_RSS.len() as u64));
48+
49+
group.bench_with_input(
50+
BenchmarkId::new("quick_xml", "sample_rss.xml"),
51+
SAMPLE_RSS,
52+
|b, input| {
53+
54+
b.iter(|| {
55+
let rss: Rss<Enclosure> = black_box(quick_xml::de::from_str(input).unwrap());
56+
assert_eq!(rss.channel.items.len(), 99);
57+
})
58+
},
59+
);
60+
61+
/* NOTE: Most parts of deserializer are not implemented yet, so benchmark failed
62+
group.bench_with_input(BenchmarkId::new("rapid-xml", "sample_rss.xml"), SAMPLE_RSS, |b, input| {
63+
use rapid_xml::de::Deserializer;
64+
use rapid_xml::parser::Parser;
65+
66+
b.iter(|| {
67+
let mut r = Parser::new(input.as_bytes());
68+
let mut de = Deserializer::new(&mut r).unwrap();
69+
let rss = black_box(Rss::deserialize(&mut de).unwrap());
70+
assert_eq!(rss.channel.items.len(), 99);
71+
});
72+
});*/
73+
74+
group.bench_with_input(
75+
BenchmarkId::new("xml_rs", "sample_rss.xml"),
76+
SAMPLE_RSS,
77+
|b, input| {
78+
b.iter(|| {
79+
let rss: Rss<Enclosure> = black_box(serde_xml_rs::from_str(input).unwrap());
80+
assert_eq!(rss.channel.items.len(), 99);
81+
})
82+
},
83+
);
84+
85+
group.finish();
86+
}
87+
88+
criterion_group!(benches, serde_comparison);
89+
criterion_main!(benches);

0 commit comments

Comments
 (0)