Skip to content

Commit d9abcb8

Browse files
committed
Add benchmarks for escaping / unescaping text
closes #404
1 parent b938a4d commit d9abcb8

File tree

1 file changed

+124
-1
lines changed

1 file changed

+124
-1
lines changed

benches/microbenches.rs

+124-1
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,28 @@ use criterion::{self, criterion_group, Criterion};
22
use pretty_assertions::assert_eq;
33
use quick_xml::events::Event;
44
use quick_xml::name::QName;
5+
use quick_xml::escape::{escape, unescape};
56
use quick_xml::Reader;
67

78
static SAMPLE: &[u8] = include_bytes!("../tests/documents/sample_rss.xml");
89
static PLAYERS: &[u8] = include_bytes!("../tests/documents/players.xml");
910

11+
static LOREM_IPSUM_TEXT: &[u8] =
12+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt
13+
ut labore et dolore magna aliqua. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque.
14+
Risus ultricies tristique nulla aliquet enim tortor at. Fermentum odio eu feugiat pretium nibh ipsum.
15+
Volutpat sed cras ornare arcu dui. Scelerisque fermentum dui faucibus in ornare quam. Arcu cursus
16+
euismod quis viverra nibh cras pulvinar mattis. Sed viverra tellus in hac habitasse platea. Quis
17+
commodo odio aenean sed. Cursus in hac habitasse platea dictumst quisque sagittis purus.
18+
19+
Neque convallis a cras semper auctor. Sit amet mauris commodo quis imperdiet massa. Ac ut consequat
20+
semper viverra nam libero justo laoreet sit. Adipiscing commodo elit at imperdiet dui accumsan.
21+
Enim lobortis scelerisque fermentum dui faucibus in ornare. Natoque penatibus et magnis dis parturient
22+
montes nascetur ridiculus mus. At lectus urna duis convallis convallis tellus id interdum. Libero
23+
volutpat sed cras ornare arcu dui vivamus arcu. Cursus in hac habitasse platea dictumst quisque sagittis
24+
purus. Consequat id porta nibh venenatis cras sed felis.";
25+
26+
1027
/// Benchmarks the `Reader::read_event` function with all XML well-formless
1128
/// checks disabled (with and without trimming content of #text nodes)
1229
fn read_event(c: &mut Criterion) {
@@ -333,11 +350,117 @@ fn attributes(c: &mut Criterion) {
333350
group.finish();
334351
}
335352

353+
/// Benchmarks escaping text using XML rules
354+
fn escaping(c: &mut Criterion) {
355+
let mut group = c.benchmark_group("escape_text");
356+
357+
group.bench_function("no_chars_to_escape_long", |b| {
358+
b.iter(|| {
359+
criterion::black_box(escape(LOREM_IPSUM_TEXT));
360+
})
361+
});
362+
363+
group.bench_function("no_chars_to_escape_short", |b| {
364+
b.iter(|| {
365+
criterion::black_box(escape(b"just bit of text"));
366+
})
367+
});
368+
369+
group.bench_function("escaped_chars_short", |b| {
370+
b.iter(|| {
371+
criterion::black_box(escape(b"age > 72 && age < 21"));
372+
criterion::black_box(escape(b"\"what's that?\""));
373+
})
374+
});
375+
376+
group.bench_function("escaped_chars_long", |b| {
377+
let lorem_ipsum_with_escape_chars =
378+
b"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt
379+
ut labore et dolore magna aliqua. & Hac habitasse platea dictumst vestibulum rhoncus est pellentesque.
380+
Risus ultricies tristique nulla aliquet enim tortor at. Fermentum odio eu feugiat pretium nibh ipsum.
381+
Volutpat sed cras ornare arcu dui. Scelerisque fermentum dui faucibus in ornare quam. Arcu cursus
382+
euismod quis< viverra nibh cras pulvinar mattis. Sed viverra tellus in hac habitasse platea. Quis
383+
commodo odio aenean sed. Cursus in hac habitasse platea dictumst quisque sagittis purus.
384+
385+
Neque convallis >a cras semper auctor. Sit amet mauris commodo quis imperdiet massa. Ac ut consequat
386+
semper viverra nam libero justo laoreet sit. 'Adipiscing' commodo elit at imperdiet dui accumsan.
387+
Enim lobortis scelerisque fermentum dui faucibus in ornare. Natoque penatibus et magnis dis parturient
388+
montes nascetur ridiculus mus. At lectus urna duis convallis convallis tellus id interdum. Libero
389+
volutpat sed cras ornare arcu dui vivamus arcu. Cursus in hac habitasse platea dictumst quisque sagittis
390+
purus. Consequat id porta nibh venenatis cras sed felis.";
391+
392+
b.iter(|| {
393+
criterion::black_box(escape(lorem_ipsum_with_escape_chars));
394+
})
395+
});
396+
group.finish();
397+
}
398+
399+
400+
/// Benchmarks unescaping text encoded using XML rules
401+
fn unescaping(c: &mut Criterion) {
402+
let mut group = c.benchmark_group("unescape_text");
403+
404+
group.bench_function("no_chars_to_unescape_long", |b| {
405+
b.iter(|| {
406+
criterion::black_box(unescape(LOREM_IPSUM_TEXT)).unwrap();
407+
})
408+
});
409+
410+
group.bench_function("no_chars_to_unescape_short", |b| {
411+
b.iter(|| {
412+
criterion::black_box(unescape(b"just a bit of text")).unwrap();
413+
})
414+
});
415+
416+
group.bench_function("char_reference", |b| {
417+
b.iter(|| {
418+
let text = b"prefix &#34;some stuff&#34;,&#x22;more stuff&#x22;";
419+
criterion::black_box(unescape(text)).unwrap();
420+
let text = b"&#38;&#60;";
421+
criterion::black_box(unescape(text)).unwrap();
422+
})
423+
});
424+
425+
group.bench_function("entity_reference", |b| {
426+
b.iter(|| {
427+
let text = b"age &gt; 72 &amp;&amp; age &lt; 21";
428+
criterion::black_box(unescape(text)).unwrap();
429+
let text = b"&quot;what&apos;s that?&quot;";
430+
criterion::black_box(unescape(text)).unwrap();
431+
})
432+
});
433+
434+
group.bench_function("mixed", |b| {
435+
let text =
436+
b"Lorem ipsum dolor sit amet, &amp;consectetur adipiscing elit, sed do eiusmod tempor incididunt
437+
ut labore et dolore magna aliqua. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque.
438+
Risus ultricies &quot;tristique nulla aliquet enim tortor&quot; at. Fermentum odio eu feugiat pretium
439+
nibh ipsum. Volutpat sed cras ornare arcu dui. Scelerisque fermentum dui faucibus in ornare quam. Arcu
440+
cursus euismod quis &#60;viverra nibh cras pulvinar mattis. Sed viverra tellus in hac habitasse platea.
441+
Quis commodo odio aenean sed. Cursus in hac habitasse platea dictumst quisque sagittis purus.
442+
443+
Neque convallis a cras semper auctor. Sit amet mauris commodo quis imperdiet massa. Ac ut consequat
444+
semper viverra nam libero justo &#35; laoreet sit. Adipiscing commodo elit at imperdiet dui accumsan.
445+
Enim lobortis scelerisque fermentum dui faucibus in ornare. Natoque penatibus et magnis dis parturient
446+
montes nascetur ridiculus mus. At lectus urna &#33;duis convallis convallis tellus id interdum. Libero
447+
volutpat sed cras ornare arcu dui vivamus arcu. Cursus in hac habitasse platea dictumst quisque sagittis
448+
purus. Consequat id porta nibh venenatis cras sed felis.";
449+
450+
b.iter(|| {
451+
criterion::black_box(unescape(text)).unwrap();
452+
})
453+
});
454+
group.finish();
455+
}
456+
336457
criterion_group!(
337458
benches,
338459
read_event,
339460
bytes_text_unescaped,
340461
read_namespaced_event,
341462
one_event,
342-
attributes
463+
attributes,
464+
escaping,
465+
unescaping,
343466
);

0 commit comments

Comments
 (0)