|
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}; |
2 | 6 |
|
3 | | -extern crate quick_xml; |
4 | | -extern crate test; |
5 | | -extern crate xml; |
| 7 | +static SOURCE: &str = include_str!("../../tests/sample_rss.xml"); |
6 | 8 |
|
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"); |
10 | 11 |
|
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(); |
24 | 25 | } |
25 | | - buf.clear(); |
26 | | - } |
27 | | - assert_eq!(count, 1550); |
| 26 | + assert_eq!(count, 1550); |
| 27 | + }) |
28 | 28 | }); |
29 | | -} |
30 | 29 |
|
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 | + } |
40 | 38 | } |
41 | | - } |
42 | | - assert_eq!(count, 1550); |
| 39 | + assert_eq!(count, 1550); |
| 40 | + }) |
43 | 41 | }); |
| 42 | + group.finish(); |
44 | 43 | } |
| 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