|
3 | 3 | extern crate test;
|
4 | 4 |
|
5 | 5 | use rustc_literal_escaper::*;
|
6 |
| -use std::fmt::Debug; |
7 | 6 | use std::iter::repeat_n;
|
8 |
| -use std::ops::Range; |
9 | 7 |
|
10 | 8 | const LEN: usize = 10_000;
|
11 | 9 |
|
@@ -37,128 +35,122 @@ fn bench_skip_ascii_whitespace(b: &mut test::Bencher) {
|
37 | 35 | // Check raw
|
38 | 36 | //
|
39 | 37 |
|
40 |
| -#[allow(clippy::type_complexity)] |
41 |
| -fn bench_check_raw<UNIT: Into<char> + PartialEq + Debug + Copy>( |
42 |
| - b: &mut test::Bencher, |
43 |
| - c: UNIT, |
44 |
| - check_raw: fn(&str, &mut dyn FnMut(Range<usize>, Result<UNIT, EscapeError>)), |
45 |
| -) { |
46 |
| - let input: String = test::black_box(repeat_n(c.into(), LEN).collect()); |
47 |
| - assert_eq!(input.len(), LEN * c.into().len_utf8()); |
| 38 | +macro_rules! fn_bench_check_raw { |
| 39 | + ($name:ident, $unit:ty, $check_raw:ident) => { |
| 40 | + fn $name(b: &mut test::Bencher, s: &str, expected: $unit) { |
| 41 | + let input: String = test::black_box(repeat_n(s, LEN).collect()); |
| 42 | + assert_eq!(input.len(), LEN * s.len()); |
| 43 | + b.iter(|| { |
| 44 | + let mut output = vec![]; |
48 | 45 |
|
49 |
| - b.iter(|| { |
50 |
| - let mut output = vec![]; |
51 |
| - |
52 |
| - check_raw(&input, &mut |range, res| output.push((range, res))); |
53 |
| - assert_eq!(output.len(), LEN); |
54 |
| - assert_eq!(output[0], (0..c.into().len_utf8(), Ok(c))); |
55 |
| - }); |
| 46 | + $check_raw(&input, |range, res| output.push((range, res))); |
| 47 | + assert_eq!(output.len(), LEN); |
| 48 | + assert_eq!(output[0], ((0..s.len()), Ok(expected))); |
| 49 | + }); |
| 50 | + } |
| 51 | + }; |
56 | 52 | }
|
57 | 53 |
|
| 54 | +fn_bench_check_raw!(bench_check_raw_str, char, check_raw_str); |
| 55 | +fn_bench_check_raw!(bench_check_raw_byte_str, u8, check_raw_byte_str); |
| 56 | +fn_bench_check_raw!(bench_check_raw_c_str, char, check_raw_c_str); |
| 57 | + |
58 | 58 | // raw str
|
59 | 59 |
|
60 | 60 | #[bench]
|
61 | 61 | fn bench_check_raw_str_ascii(b: &mut test::Bencher) {
|
62 |
| - bench_check_raw(b, 'a', |s, cb| check_raw_str(s, cb)); |
| 62 | + bench_check_raw_str(b, "a", 'a'); |
63 | 63 | }
|
64 | 64 |
|
65 | 65 | #[bench]
|
66 | 66 | fn bench_check_raw_str_unicode(b: &mut test::Bencher) {
|
67 |
| - bench_check_raw(b, '🦀', |s, cb| check_raw_str(s, cb)); |
| 67 | + bench_check_raw_str(b, "🦀", '🦀'); |
68 | 68 | }
|
69 | 69 |
|
70 | 70 | // raw byte str
|
71 | 71 |
|
72 | 72 | #[bench]
|
73 |
| -fn bench_check_raw_byte_str(b: &mut test::Bencher) { |
74 |
| - bench_check_raw(b, b'a', |s, cb| check_raw_byte_str(s, cb)); |
| 73 | +fn bench_check_raw_byte_str_ascii(b: &mut test::Bencher) { |
| 74 | + bench_check_raw_byte_str(b, "a", b'a'); |
75 | 75 | }
|
76 | 76 |
|
77 | 77 | // raw C str
|
78 | 78 |
|
79 | 79 | #[bench]
|
80 | 80 | fn bench_check_raw_c_str_ascii(b: &mut test::Bencher) {
|
81 |
| - bench_check_raw(b, 'a', |s, cb| check_raw_c_str(s, cb)); |
| 81 | + bench_check_raw_c_str(b, "a", 'a'); |
82 | 82 | }
|
83 | 83 |
|
84 | 84 | #[bench]
|
85 | 85 | fn bench_check_raw_c_str_unicode(b: &mut test::Bencher) {
|
86 |
| - bench_check_raw(b, '🦀', |s, cb| check_raw_c_str(s, cb)); |
| 86 | + bench_check_raw_c_str(b, "🦀", '🦀'); |
87 | 87 | }
|
88 | 88 |
|
89 | 89 | //
|
90 | 90 | // Unescape
|
91 | 91 | //
|
92 | 92 |
|
93 |
| -#[allow(clippy::type_complexity)] |
94 |
| -fn bench_unescape<UNIT: Into<char> + PartialEq + Debug + Copy>( |
95 |
| - b: &mut test::Bencher, |
96 |
| - s: &str, |
97 |
| - expected: UNIT, |
98 |
| - unescape: fn(&str, &mut dyn FnMut(Range<usize>, Result<UNIT, EscapeError>)), |
99 |
| -) { |
100 |
| - let input: String = test::black_box(repeat_n(s, LEN).collect()); |
101 |
| - assert_eq!(input.len(), LEN * s.len()); |
102 |
| - b.iter(|| { |
103 |
| - let mut output = vec![]; |
104 |
| - unescape(&input, &mut |range, res| output.push((range, res))); |
105 |
| - assert_eq!(output.len(), LEN); |
106 |
| - assert_eq!(output[0], ((0..s.len()), Ok(expected))); |
107 |
| - }); |
| 93 | +macro_rules! fn_bench_unescape { |
| 94 | + ($name:ident, $unit:ty, $unescape:ident) => { |
| 95 | + fn $name(b: &mut test::Bencher, s: &str, expected: $unit) { |
| 96 | + let input: String = test::black_box(repeat_n(s, LEN).collect()); |
| 97 | + assert_eq!(input.len(), LEN * s.len()); |
| 98 | + b.iter(|| { |
| 99 | + let mut output = vec![]; |
| 100 | + |
| 101 | + $unescape(&input, |range, res| output.push((range, res))); |
| 102 | + assert_eq!(output.len(), LEN); |
| 103 | + assert_eq!(output[0], ((0..s.len()), Ok(expected))); |
| 104 | + }); |
| 105 | + } |
| 106 | + }; |
108 | 107 | }
|
109 | 108 |
|
| 109 | +fn_bench_unescape!(bench_unescape_str, char, unescape_str); |
| 110 | +fn_bench_unescape!(bench_unescape_byte_str, u8, unescape_byte_str); |
| 111 | +fn_bench_unescape!(bench_unescape_c_str, MixedUnit, unescape_c_str); |
| 112 | + |
110 | 113 | // str
|
111 | 114 |
|
112 | 115 | #[bench]
|
113 | 116 | fn bench_unescape_str_trivial(b: &mut test::Bencher) {
|
114 |
| - bench_unescape(b, r"a", 'a', |s, cb| unescape_str(s, cb)); |
| 117 | + bench_unescape_str(b, r"a", 'a'); |
115 | 118 | }
|
116 | 119 |
|
117 | 120 | #[bench]
|
118 | 121 | fn bench_unescape_str_ascii(b: &mut test::Bencher) {
|
119 |
| - bench_unescape(b, r"\n", '\n', |s, cb| unescape_str(s, cb)); |
| 122 | + bench_unescape_str(b, r"\n", '\n'); |
120 | 123 | }
|
121 | 124 |
|
122 | 125 | #[bench]
|
123 | 126 | fn bench_unescape_str_hex(b: &mut test::Bencher) {
|
124 |
| - bench_unescape(b, r"\x22", '"', |s, cb| unescape_str(s, cb)); |
| 127 | + bench_unescape_str(b, r"\x22", '"'); |
125 | 128 | }
|
126 | 129 |
|
127 | 130 | #[bench]
|
128 | 131 | fn bench_unescape_str_unicode(b: &mut test::Bencher) {
|
129 |
| - bench_unescape(b, r"\u{1f980}", '🦀', |s, cb| unescape_str(s, cb)); |
| 132 | + bench_unescape_str(b, r"\u{1f980}", '🦀'); |
130 | 133 | }
|
131 | 134 |
|
132 | 135 | // byte str
|
133 | 136 |
|
134 | 137 | #[bench]
|
135 | 138 | fn bench_unescape_byte_str_trivial(b: &mut test::Bencher) {
|
136 |
| - bench_unescape(b, r"a", b'a', |s, cb| unescape_byte_str(s, cb)); |
| 139 | + bench_unescape_byte_str(b, r"a", b'a'); |
137 | 140 | }
|
138 | 141 |
|
139 | 142 | #[bench]
|
140 | 143 | fn bench_unescape_byte_str_ascii(b: &mut test::Bencher) {
|
141 |
| - bench_unescape(b, r"\n", b'\n', |s, cb| unescape_byte_str(s, cb)); |
| 144 | + bench_unescape_byte_str(b, r"\n", b'\n'); |
142 | 145 | }
|
143 | 146 |
|
144 | 147 | #[bench]
|
145 | 148 | fn bench_unescape_byte_str_hex(b: &mut test::Bencher) {
|
146 |
| - bench_unescape(b, r"\xff", b'\xff', |s, cb| unescape_byte_str(s, cb)); |
| 149 | + bench_unescape_byte_str(b, r"\xff", b'\xff'); |
147 | 150 | }
|
148 | 151 |
|
149 | 152 | // C str
|
150 | 153 |
|
151 |
| -fn bench_unescape_c_str(b: &mut test::Bencher, s: &str, expected: MixedUnit) { |
152 |
| - let input: String = test::black_box(repeat_n(s, LEN).collect()); |
153 |
| - assert_eq!(input.len(), LEN * s.len()); |
154 |
| - b.iter(|| { |
155 |
| - let mut output = vec![]; |
156 |
| - unescape_c_str(&input, &mut |range, res| output.push((range, res))); |
157 |
| - assert_eq!(output.len(), LEN); |
158 |
| - assert_eq!(output[0], ((0..s.len()), Ok(expected))); |
159 |
| - }); |
160 |
| -} |
161 |
| - |
162 | 154 | #[bench]
|
163 | 155 | fn bench_unescape_c_str_trivial(b: &mut test::Bencher) {
|
164 | 156 | bench_unescape_c_str(b, r"a", MixedUnit::Char('a'));
|
|
0 commit comments