11use criterion:: { self , criterion_group, Criterion } ;
22use pretty_assertions:: assert_eq;
3+ use quick_xml:: escape:: { escape, unescape} ;
34use quick_xml:: events:: Event ;
45use quick_xml:: name:: QName ;
56use quick_xml:: Reader ;
67
78static SAMPLE : & [ u8 ] = include_bytes ! ( "../tests/documents/sample_rss.xml" ) ;
89static 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+
1026/// Benchmarks the `Reader::read_event` function with all XML well-formless
1127/// checks disabled (with and without trimming content of #text nodes)
1228fn read_event ( c : & mut Criterion ) {
@@ -25,7 +41,10 @@ fn read_event(c: &mut Criterion) {
2541 }
2642 buf. clear ( ) ;
2743 }
28- assert_eq ! ( count, 1550 , "Overall tag count in ./tests/documents/sample_rss.xml" ) ;
44+ assert_eq ! (
45+ count, 1550 ,
46+ "Overall tag count in ./tests/documents/sample_rss.xml"
47+ ) ;
2948 } )
3049 } ) ;
3150
@@ -45,7 +64,10 @@ fn read_event(c: &mut Criterion) {
4564 }
4665 buf. clear ( ) ;
4766 }
48- assert_eq ! ( count, 1550 , "Overall tag count in ./tests/documents/sample_rss.xml" ) ;
67+ assert_eq ! (
68+ count, 1550 ,
69+ "Overall tag count in ./tests/documents/sample_rss.xml"
70+ ) ;
4971 } ) ;
5072 } ) ;
5173 group. finish ( ) ;
@@ -70,7 +92,10 @@ fn read_namespaced_event(c: &mut Criterion) {
7092 }
7193 buf. clear ( ) ;
7294 }
73- assert_eq ! ( count, 1550 , "Overall tag count in ./tests/documents/sample_rss.xml" ) ;
95+ assert_eq ! (
96+ count, 1550 ,
97+ "Overall tag count in ./tests/documents/sample_rss.xml"
98+ ) ;
7499 } ) ;
75100 } ) ;
76101
@@ -91,7 +116,10 @@ fn read_namespaced_event(c: &mut Criterion) {
91116 }
92117 buf. clear ( ) ;
93118 }
94- assert_eq ! ( count, 1550 , "Overall tag count in ./tests/documents/sample_rss.xml" ) ;
119+ assert_eq ! (
120+ count, 1550 ,
121+ "Overall tag count in ./tests/documents/sample_rss.xml"
122+ ) ;
95123 } ) ;
96124 } ) ;
97125 group. finish ( ) ;
@@ -117,7 +145,10 @@ fn bytes_text_unescaped(c: &mut Criterion) {
117145 }
118146 buf. clear ( ) ;
119147 }
120- assert_eq ! ( count, 1550 , "Overall tag count in ./tests/documents/sample_rss.xml" ) ;
148+ assert_eq ! (
149+ count, 1550 ,
150+ "Overall tag count in ./tests/documents/sample_rss.xml"
151+ ) ;
121152
122153 // Windows has \r\n instead of \n
123154 #[ cfg( windows) ]
@@ -152,7 +183,10 @@ fn bytes_text_unescaped(c: &mut Criterion) {
152183 }
153184 buf. clear ( ) ;
154185 }
155- assert_eq ! ( count, 1550 , "Overall tag count in ./tests/documents/sample_rss.xml" ) ;
186+ assert_eq ! (
187+ count, 1550 ,
188+ "Overall tag count in ./tests/documents/sample_rss.xml"
189+ ) ;
156190
157191 // Windows has \r\n instead of \n
158192 #[ cfg( windows) ]
@@ -333,11 +367,116 @@ fn attributes(c: &mut Criterion) {
333367 group. finish ( ) ;
334368}
335369
370+ /// Benchmarks escaping text using XML rules
371+ fn escaping ( c : & mut Criterion ) {
372+ let mut group = c. benchmark_group ( "escape_text" ) ;
373+
374+ group. bench_function ( "no_chars_to_escape_long" , |b| {
375+ b. iter ( || {
376+ criterion:: black_box ( escape ( LOREM_IPSUM_TEXT ) ) ;
377+ } )
378+ } ) ;
379+
380+ group. bench_function ( "no_chars_to_escape_short" , |b| {
381+ b. iter ( || {
382+ criterion:: black_box ( escape ( b"just bit of text" ) ) ;
383+ } )
384+ } ) ;
385+
386+ group. bench_function ( "escaped_chars_short" , |b| {
387+ b. iter ( || {
388+ criterion:: black_box ( escape ( b"age > 72 && age < 21" ) ) ;
389+ criterion:: black_box ( escape ( b"\" what's that?\" " ) ) ;
390+ } )
391+ } ) ;
392+
393+ group. bench_function ( "escaped_chars_long" , |b| {
394+ let lorem_ipsum_with_escape_chars =
395+ b"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt
396+ ut labore et dolore magna aliqua. & Hac habitasse platea dictumst vestibulum rhoncus est pellentesque.
397+ Risus ultricies tristique nulla aliquet enim tortor at. Fermentum odio eu feugiat pretium nibh ipsum.
398+ Volutpat sed cras ornare arcu dui. Scelerisque fermentum dui faucibus in ornare quam. Arcu cursus
399+ euismod quis< viverra nibh cras pulvinar mattis. Sed viverra tellus in hac habitasse platea. Quis
400+ commodo odio aenean sed. Cursus in hac habitasse platea dictumst quisque sagittis purus.
401+
402+ Neque convallis >a cras semper auctor. Sit amet mauris commodo quis imperdiet massa. Ac ut consequat
403+ semper viverra nam libero justo laoreet sit. 'Adipiscing' commodo elit at imperdiet dui accumsan.
404+ Enim lobortis scelerisque fermentum dui faucibus in ornare. Natoque penatibus et magnis dis parturient
405+ montes nascetur ridiculus mus. At lectus urna duis convallis convallis tellus id interdum. Libero
406+ volutpat sed cras ornare arcu dui vivamus arcu. Cursus in hac habitasse platea dictumst quisque sagittis
407+ purus. Consequat id porta nibh venenatis cras sed felis." ;
408+
409+ b. iter ( || {
410+ criterion:: black_box ( escape ( lorem_ipsum_with_escape_chars) ) ;
411+ } )
412+ } ) ;
413+ group. finish ( ) ;
414+ }
415+
416+ /// Benchmarks unescaping text encoded using XML rules
417+ fn unescaping ( c : & mut Criterion ) {
418+ let mut group = c. benchmark_group ( "unescape_text" ) ;
419+
420+ group. bench_function ( "no_chars_to_unescape_long" , |b| {
421+ b. iter ( || {
422+ criterion:: black_box ( unescape ( LOREM_IPSUM_TEXT ) ) . unwrap ( ) ;
423+ } )
424+ } ) ;
425+
426+ group. bench_function ( "no_chars_to_unescape_short" , |b| {
427+ b. iter ( || {
428+ criterion:: black_box ( unescape ( b"just a bit of text" ) ) . unwrap ( ) ;
429+ } )
430+ } ) ;
431+
432+ group. bench_function ( "char_reference" , |b| {
433+ b. iter ( || {
434+ let text = b"prefix "some stuff","more stuff"" ;
435+ criterion:: black_box ( unescape ( text) ) . unwrap ( ) ;
436+ let text = b"&<" ;
437+ criterion:: black_box ( unescape ( text) ) . unwrap ( ) ;
438+ } )
439+ } ) ;
440+
441+ group. bench_function ( "entity_reference" , |b| {
442+ b. iter ( || {
443+ let text = b"age > 72 && age < 21" ;
444+ criterion:: black_box ( unescape ( text) ) . unwrap ( ) ;
445+ let text = b""what's that?"" ;
446+ criterion:: black_box ( unescape ( text) ) . unwrap ( ) ;
447+ } )
448+ } ) ;
449+
450+ group. bench_function ( "mixed" , |b| {
451+ let text =
452+ b"Lorem ipsum dolor sit amet, &consectetur adipiscing elit, sed do eiusmod tempor incididunt
453+ ut labore et dolore magna aliqua. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque.
454+ Risus ultricies "tristique nulla aliquet enim tortor" at. Fermentum odio eu feugiat pretium
455+ nibh ipsum. Volutpat sed cras ornare arcu dui. Scelerisque fermentum dui faucibus in ornare quam. Arcu
456+ cursus euismod quis <viverra nibh cras pulvinar mattis. Sed viverra tellus in hac habitasse platea.
457+ Quis commodo odio aenean sed. Cursus in hac habitasse platea dictumst quisque sagittis purus.
458+
459+ Neque convallis a cras semper auctor. Sit amet mauris commodo quis imperdiet massa. Ac ut consequat
460+ semper viverra nam libero justo # laoreet sit. Adipiscing commodo elit at imperdiet dui accumsan.
461+ Enim lobortis scelerisque fermentum dui faucibus in ornare. Natoque penatibus et magnis dis parturient
462+ montes nascetur ridiculus mus. At lectus urna !duis convallis convallis tellus id interdum. Libero
463+ volutpat sed cras ornare arcu dui vivamus arcu. Cursus in hac habitasse platea dictumst quisque sagittis
464+ purus. Consequat id porta nibh venenatis cras sed felis." ;
465+
466+ b. iter ( || {
467+ criterion:: black_box ( unescape ( text) ) . unwrap ( ) ;
468+ } )
469+ } ) ;
470+ group. finish ( ) ;
471+ }
472+
336473criterion_group ! (
337474 benches,
338475 read_event,
339476 bytes_text_unescaped,
340477 read_namespaced_event,
341478 one_event,
342- attributes
479+ attributes,
480+ escaping,
481+ unescaping,
343482) ;
0 commit comments