Skip to content

Commit 40fc95a

Browse files
committed
reduce benchmark overhead
1 parent 6faef8e commit 40fc95a

File tree

1 file changed

+48
-56
lines changed

1 file changed

+48
-56
lines changed

benches/benches.rs

Lines changed: 48 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
extern crate test;
44

55
use rustc_literal_escaper::*;
6-
use std::fmt::Debug;
76
use std::iter::repeat_n;
8-
use std::ops::Range;
97

108
const LEN: usize = 10_000;
119

@@ -37,128 +35,122 @@ fn bench_skip_ascii_whitespace(b: &mut test::Bencher) {
3735
// Check raw
3836
//
3937

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![];
4845

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+
};
5652
}
5753

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+
5858
// raw str
5959

6060
#[bench]
6161
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');
6363
}
6464

6565
#[bench]
6666
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, "🦀", '🦀');
6868
}
6969

7070
// raw byte str
7171

7272
#[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');
7575
}
7676

7777
// raw C str
7878

7979
#[bench]
8080
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');
8282
}
8383

8484
#[bench]
8585
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, "🦀", '🦀');
8787
}
8888

8989
//
9090
// Unescape
9191
//
9292

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+
};
108107
}
109108

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+
110113
// str
111114

112115
#[bench]
113116
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');
115118
}
116119

117120
#[bench]
118121
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');
120123
}
121124

122125
#[bench]
123126
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", '"');
125128
}
126129

127130
#[bench]
128131
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}", '🦀');
130133
}
131134

132135
// byte str
133136

134137
#[bench]
135138
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');
137140
}
138141

139142
#[bench]
140143
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');
142145
}
143146

144147
#[bench]
145148
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');
147150
}
148151

149152
// C str
150153

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-
162154
#[bench]
163155
fn bench_unescape_c_str_trivial(b: &mut test::Bencher) {
164156
bench_unescape_c_str(b, r"a", MixedUnit::Char('a'));

0 commit comments

Comments
 (0)