@@ -2,11 +2,28 @@ use criterion::{self, criterion_group, Criterion};
2
2
use pretty_assertions:: assert_eq;
3
3
use quick_xml:: events:: Event ;
4
4
use quick_xml:: name:: QName ;
5
+ use quick_xml:: escape:: { escape, unescape} ;
5
6
use quick_xml:: Reader ;
6
7
7
8
static SAMPLE : & [ u8 ] = include_bytes ! ( "../tests/documents/sample_rss.xml" ) ;
8
9
static PLAYERS : & [ u8 ] = include_bytes ! ( "../tests/documents/players.xml" ) ;
9
10
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
+
10
27
/// Benchmarks the `Reader::read_event` function with all XML well-formless
11
28
/// checks disabled (with and without trimming content of #text nodes)
12
29
fn read_event ( c : & mut Criterion ) {
@@ -333,11 +350,117 @@ fn attributes(c: &mut Criterion) {
333
350
group. finish ( ) ;
334
351
}
335
352
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 "some stuff","more stuff"" ;
419
+ criterion:: black_box ( unescape ( text) ) . unwrap ( ) ;
420
+ let text = b"&<" ;
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 > 72 && age < 21" ;
428
+ criterion:: black_box ( unescape ( text) ) . unwrap ( ) ;
429
+ let text = b""what's that?"" ;
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, &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 "tristique nulla aliquet enim tortor" 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 <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 # 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 !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
+
336
457
criterion_group ! (
337
458
benches,
338
459
read_event,
339
460
bytes_text_unescaped,
340
461
read_namespaced_event,
341
462
one_event,
342
- attributes
463
+ attributes,
464
+ escaping,
465
+ unescaping,
343
466
) ;
0 commit comments