/
like_bench.rs
86 lines (81 loc) · 2.45 KB
/
like_bench.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use const_currying::const_currying;
#[const_currying]
fn like(
s: &str,
p: &str,
#[maybe_const(consts = [b'\\'])] escape: u8,
#[maybe_const(consts = [true, false])] case_sensitive: bool,
) -> bool {
let (mut px, mut sx) = (0, 0);
let (mut next_px, mut next_sx) = (0, 0);
let (pbytes, sbytes) = (p.as_bytes(), s.as_bytes());
while px < pbytes.len() || sx < sbytes.len() {
if px < pbytes.len() {
let c = pbytes[px];
match c {
b'_' => {
if sx < sbytes.len() {
px += 1;
sx += 1;
continue;
}
}
b'%' => {
next_px = px;
next_sx = sx + 1;
px += 1;
continue;
}
mut pc => {
if ((!case_sensitive && pc == escape)
|| (case_sensitive && pc.eq_ignore_ascii_case(&escape)))
&& px + 1 < pbytes.len()
{
px += 1;
pc = pbytes[px];
}
if sx < sbytes.len()
&& ((!case_sensitive && sbytes[sx] == pc)
|| (case_sensitive && sbytes[sx].eq_ignore_ascii_case(&pc)))
{
px += 1;
sx += 1;
continue;
}
}
}
}
if 0 < next_sx && next_sx <= sbytes.len() {
px = next_px;
sx = next_sx;
continue;
}
return false;
}
true
}
fn criterion_benchmark(c: &mut Criterion) {
c.bench_function("like base", |b| {
b.iter(|| {
like_orig(
black_box("ab\\bbccddeefff"),
black_box("ab\\%%%ccd*f"),
black_box(b'\\'),
black_box(true),
)
})
});
c.bench_function("like optimized", |b| {
b.iter(|| {
like(
black_box("ab\\bbccddeefff"),
black_box("ab\\%%%ccd*f"),
black_box(b'\\'),
black_box(true),
)
})
});
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);