@@ -6,13 +6,15 @@ use criterion::{
6
6
profiler:: Profiler ,
7
7
PlottingBackend ,
8
8
} ;
9
+ use regex:: Regex ;
9
10
10
- use crate :: { Bencher , BenchmarkGroup , BenchmarkId } ;
11
+ use crate :: { Bencher , BenchmarkFilter , BenchmarkGroup , BenchmarkId } ;
11
12
12
13
pub struct Criterion < M : Measurement = WallTime > {
13
14
pub codspeed : Option < Rc < RefCell < CodSpeed > > > ,
14
15
pub current_file : String ,
15
16
pub macro_group : String ,
17
+ pub filter : BenchmarkFilter ,
16
18
phantom : PhantomData < * const M > ,
17
19
}
18
20
@@ -23,19 +25,57 @@ impl Criterion {
23
25
"Harness: codspeed-criterion-compat v{}" ,
24
26
env!( "CARGO_PKG_VERSION" ) ,
25
27
) ;
28
+
29
+ // Parse CLI arguments to extract filter
30
+ let filter = Self :: parse_filter ( ) ;
31
+
26
32
Criterion {
27
33
codspeed : Some ( Rc :: new ( RefCell :: new ( CodSpeed :: new ( ) ) ) ) ,
28
34
current_file : String :: new ( ) ,
29
35
macro_group : String :: new ( ) ,
36
+ filter,
30
37
phantom : PhantomData ,
31
38
}
32
39
}
33
40
41
+ fn parse_filter ( ) -> BenchmarkFilter {
42
+ use clap:: { Arg , Command } ;
43
+
44
+ let matches = Command :: new ( "Criterion Benchmark" )
45
+ . arg (
46
+ Arg :: new ( "FILTER" )
47
+ . help ( "Skip benchmarks whose names do not contain FILTER." )
48
+ . index ( 1 ) ,
49
+ )
50
+ . arg (
51
+ Arg :: new ( "exact" )
52
+ . long ( "exact" )
53
+ . num_args ( 0 )
54
+ . help ( "Run benchmarks that exactly match the provided filter" ) ,
55
+ )
56
+ . get_matches ( ) ;
57
+
58
+ if let Some ( filter) = matches. get_one :: < String > ( "FILTER" ) {
59
+ if matches. get_flag ( "exact" ) {
60
+ BenchmarkFilter :: Exact ( filter. to_owned ( ) )
61
+ } else {
62
+ let regex = Regex :: new ( filter) . unwrap_or_else ( |err| {
63
+ eprintln ! ( "Unable to parse '{filter}' as a regular expression: {err}" ) ;
64
+ std:: process:: exit ( 1 ) ;
65
+ } ) ;
66
+ BenchmarkFilter :: Regex ( regex)
67
+ }
68
+ } else {
69
+ BenchmarkFilter :: AcceptAll
70
+ }
71
+ }
72
+
34
73
pub fn with_patched_measurement < M : Measurement > ( & mut self , _: Criterion < M > ) -> Criterion < M > {
35
74
Criterion {
36
75
codspeed : self . codspeed . clone ( ) ,
37
76
current_file : self . current_file . clone ( ) ,
38
77
macro_group : self . macro_group . clone ( ) ,
78
+ filter : self . filter . clone ( ) ,
39
79
phantom : PhantomData ,
40
80
}
41
81
}
@@ -92,6 +132,7 @@ impl Default for Criterion {
92
132
codspeed : None ,
93
133
current_file : String :: new ( ) ,
94
134
macro_group : String :: new ( ) ,
135
+ filter : BenchmarkFilter :: AcceptAll ,
95
136
phantom : PhantomData ,
96
137
}
97
138
}
@@ -104,6 +145,7 @@ impl<M: Measurement> Criterion<M> {
104
145
codspeed : self . codspeed ,
105
146
current_file : self . current_file ,
106
147
macro_group : self . macro_group ,
148
+ filter : self . filter ,
107
149
phantom : PhantomData :: < * const M2 > ,
108
150
}
109
151
}
0 commit comments