Skip to content

Commit f2df5ae

Browse files
committed
reduce benchmark overhead
1 parent 6faef8e commit f2df5ae

File tree

1 file changed

+50
-56
lines changed

1 file changed

+50
-56
lines changed

benches/benches.rs

Lines changed: 50 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -37,128 +37,122 @@ fn bench_skip_ascii_whitespace(b: &mut test::Bencher) {
3737
// Check raw
3838
//
3939

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());
48-
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-
});
56-
}
40+
macro_rules! fn_bench_check_raw {
41+
($name:ident, $unit:ty, $check_raw:ident) => {
42+
fn $name(b: &mut test::Bencher, s: &str, expected: $unit) {
43+
let input: String = test::black_box(repeat_n(s, LEN).collect());
44+
assert_eq!(input.len(), LEN * s.len());
45+
b.iter(|| {
46+
let mut output = vec![];
47+
48+
$check_raw(&input, |range, res| output.push((range, res)));
49+
assert_eq!(output.len(), LEN);
50+
assert_eq!(output[0], ((0..s.len()), Ok(expected)));
51+
});
52+
}
53+
};
54+
}
55+
56+
fn_bench_check_raw!(bench_check_raw_str, char, check_raw_str);
57+
fn_bench_check_raw!(bench_check_raw_byte_str, u8, check_raw_byte_str);
58+
fn_bench_check_raw!(bench_check_raw_c_str, char, check_raw_c_str);
5759

5860
// raw str
5961

6062
#[bench]
6163
fn bench_check_raw_str_ascii(b: &mut test::Bencher) {
62-
bench_check_raw(b, 'a', |s, cb| check_raw_str(s, cb));
64+
bench_check_raw_str(b, "a", 'a');
6365
}
6466

6567
#[bench]
6668
fn bench_check_raw_str_unicode(b: &mut test::Bencher) {
67-
bench_check_raw(b, '🦀', |s, cb| check_raw_str(s, cb));
69+
bench_check_raw_str(b, "🦀", '🦀');
6870
}
6971

7072
// raw byte str
7173

7274
#[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));
75+
fn bench_check_raw_byte_str_ascii(b: &mut test::Bencher) {
76+
bench_check_raw_byte_str(b, "a", b'a');
7577
}
7678

7779
// raw C str
7880

7981
#[bench]
8082
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));
83+
bench_check_raw_c_str(b, "a", 'a');
8284
}
8385

8486
#[bench]
8587
fn bench_check_raw_c_str_unicode(b: &mut test::Bencher) {
86-
bench_check_raw(b, '🦀', |s, cb| check_raw_c_str(s, cb));
88+
bench_check_raw_c_str(b, "🦀", '🦀');
8789
}
8890

8991
//
9092
// Unescape
9193
//
9294

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-
});
95+
macro_rules! fn_bench_unescape {
96+
($name:ident, $unit:ty, $unescape:ident) => {
97+
fn $name(b: &mut test::Bencher, s: &str, expected: $unit) {
98+
let input: String = test::black_box(repeat_n(s, LEN).collect());
99+
assert_eq!(input.len(), LEN * s.len());
100+
b.iter(|| {
101+
let mut output = vec![];
102+
103+
$unescape(&input, |range, res| output.push((range, res)));
104+
assert_eq!(output.len(), LEN);
105+
assert_eq!(output[0], ((0..s.len()), Ok(expected)));
106+
});
107+
}
108+
};
108109
}
109110

111+
fn_bench_unescape!(bench_unescape_str, char, unescape_str);
112+
fn_bench_unescape!(bench_unescape_byte_str, u8, unescape_byte_str);
113+
fn_bench_unescape!(bench_unescape_c_str, MixedUnit, unescape_c_str);
114+
110115
// str
111116

112117
#[bench]
113118
fn bench_unescape_str_trivial(b: &mut test::Bencher) {
114-
bench_unescape(b, r"a", 'a', |s, cb| unescape_str(s, cb));
119+
bench_unescape_str(b, r"a", 'a');
115120
}
116121

117122
#[bench]
118123
fn bench_unescape_str_ascii(b: &mut test::Bencher) {
119-
bench_unescape(b, r"\n", '\n', |s, cb| unescape_str(s, cb));
124+
bench_unescape_str(b, r"\n", '\n');
120125
}
121126

122127
#[bench]
123128
fn bench_unescape_str_hex(b: &mut test::Bencher) {
124-
bench_unescape(b, r"\x22", '"', |s, cb| unescape_str(s, cb));
129+
bench_unescape_str(b, r"\x22", '"');
125130
}
126131

127132
#[bench]
128133
fn bench_unescape_str_unicode(b: &mut test::Bencher) {
129-
bench_unescape(b, r"\u{1f980}", '🦀', |s, cb| unescape_str(s, cb));
134+
bench_unescape_str(b, r"\u{1f980}", '🦀');
130135
}
131136

132137
// byte str
133138

134139
#[bench]
135140
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));
141+
bench_unescape_byte_str(b, r"a", b'a');
137142
}
138143

139144
#[bench]
140145
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));
146+
bench_unescape_byte_str(b, r"\n", b'\n');
142147
}
143148

144149
#[bench]
145150
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));
151+
bench_unescape_byte_str(b, r"\xff", b'\xff');
147152
}
148153

149154
// C str
150155

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

0 commit comments

Comments
 (0)