1 use clap::{arg, Arg, ArgAction, Command};
2 use criterion::{criterion_group, criterion_main, Criterion};
3
4 static OPT3_VALS: [&str; 2] = ["fast", "slow"];
5 static POS3_VALS: [&str; 2] = ["vi", "emacs"];
6
7 macro_rules! create_app {
8 () => {{
9 Command::new("claptests")
10 .version("0.1")
11 .about("tests clap library")
12 .author("Kevin K. <kbknapp@gmail.com>")
13 .arg(arg!(-o --option <opt> ... "tests options"))
14 .arg(arg!([positional] "tests positionals"))
15 .arg(arg!(-f --flag ... "tests flags").global(true))
16 .args([
17 arg!(flag2: -F "tests flags with exclusions")
18 .conflicts_with("flag")
19 .requires("option2"),
20 arg!(option2: --"long-option-2" <option2> "tests long options with exclusions")
21 .conflicts_with("option")
22 .requires("positional2"),
23 arg!([positional2] "tests positionals with exclusions"),
24 arg!(-O --Option <option3> "tests options with specific value sets")
25 .value_parser(OPT3_VALS),
26 arg!([positional3] ... "tests positionals with specific values")
27 .value_parser(POS3_VALS),
28 arg!(--multvals <s> "Tests multiple values not mult occs").value_names(["one", "two"]),
29 arg!(
30 --multvalsmo <s> "Tests multiple values, not mult occs"
31 ).required(false).value_names(["one", "two"]),
32 arg!(--minvals2 <minvals> ... "Tests 2 min vals").num_args(2..),
33 arg!(--maxvals3 <maxvals> ... "Tests 3 max vals").num_args(1..=3),
34 ])
35 .subcommand(
36 Command::new("subcmd")
37 .about("tests subcommands")
38 .version("0.1")
39 .author("Kevin K. <kbknapp@gmail.com>")
40 .arg(arg!(-o --option <scoption> ... "tests options"))
41 .arg(arg!([scpositional] "tests positionals"))
42 )
43 }};
44 }
45
build_from_builder(c: &mut Criterion)46 pub fn build_from_builder(c: &mut Criterion) {
47 c.bench_function("build_from_builder", |b| {
48 b.iter(|| {
49 Command::new("claptests")
50 .version("0.1")
51 .about("tests clap library")
52 .author("Kevin K. <kbknapp@gmail.com>")
53 .arg(
54 Arg::new("opt")
55 .help("tests options")
56 .short('o')
57 .long("option")
58 .num_args(1..)
59 .action(ArgAction::Append),
60 )
61 .arg(Arg::new("positional").help("tests positionals").index(1))
62 .arg(
63 Arg::new("flag")
64 .short('f')
65 .help("tests flags")
66 .long("flag")
67 .global(true)
68 .action(ArgAction::Count),
69 )
70 .arg(
71 Arg::new("flag2")
72 .short('F')
73 .help("tests flags with exclusions")
74 .action(ArgAction::SetTrue)
75 .conflicts_with("flag")
76 .requires("option2"),
77 )
78 .arg(
79 Arg::new("option2")
80 .help("tests long options with exclusions")
81 .conflicts_with("option")
82 .requires("positional2")
83 .action(ArgAction::Set)
84 .long("long-option-2"),
85 )
86 .arg(
87 Arg::new("positional2")
88 .index(3)
89 .help("tests positionals with exclusions"),
90 )
91 .arg(
92 Arg::new("option3")
93 .short('O')
94 .long("Option")
95 .action(ArgAction::Set)
96 .help("tests options with specific value sets")
97 .value_parser(OPT3_VALS),
98 )
99 .arg(
100 Arg::new("positional3")
101 .num_args(1..)
102 .help("tests positionals with specific values")
103 .index(4)
104 .value_parser(POS3_VALS),
105 )
106 .arg(
107 Arg::new("multvals")
108 .long("multvals")
109 .help("Tests multiple values, not mult occs")
110 .value_names(["one", "two"]),
111 )
112 .arg(
113 Arg::new("multvalsmo")
114 .long("multvalsmo")
115 .action(ArgAction::Append)
116 .help("Tests multiple values, not mult occs")
117 .value_names(["one", "two"]),
118 )
119 .arg(
120 Arg::new("minvals")
121 .long("minvals2")
122 .action(ArgAction::Append)
123 .help("Tests 2 min vals")
124 .num_args(2..),
125 )
126 .arg(
127 Arg::new("maxvals")
128 .long("maxvals3")
129 .action(ArgAction::Append)
130 .help("Tests 3 max vals")
131 .num_args(1..=3),
132 )
133 .subcommand(
134 Command::new("subcmd")
135 .about("tests subcommands")
136 .version("0.1")
137 .author("Kevin K. <kbknapp@gmail.com>")
138 .arg(
139 Arg::new("scoption")
140 .short('o')
141 .long("option")
142 .num_args(1..)
143 .action(ArgAction::Append)
144 .help("tests options"),
145 )
146 .arg(Arg::new("scpositional").index(1).help("tests positionals")),
147 )
148 })
149 });
150 }
151
parse_complex(c: &mut Criterion)152 pub fn parse_complex(c: &mut Criterion) {
153 c.bench_function("parse_complex", |b| {
154 b.iter(|| create_app!().get_matches_from(vec![""]))
155 });
156 }
157
parse_complex_with_flag(c: &mut Criterion)158 pub fn parse_complex_with_flag(c: &mut Criterion) {
159 c.bench_function("parse_complex_with_flag", |b| {
160 b.iter(|| create_app!().get_matches_from(vec!["myprog", "-f"]))
161 });
162 }
163
parse_complex_with_opt(c: &mut Criterion)164 pub fn parse_complex_with_opt(c: &mut Criterion) {
165 c.bench_function("parse_complex_with_opt", |b| {
166 b.iter(|| create_app!().get_matches_from(vec!["myprog", "-o", "option1"]))
167 });
168 }
169
parse_complex_with_pos(c: &mut Criterion)170 pub fn parse_complex_with_pos(c: &mut Criterion) {
171 c.bench_function("parse_complex_with_pos", |b| {
172 b.iter(|| create_app!().get_matches_from(vec!["myprog", "arg1"]))
173 });
174 }
175
parse_complex_with_sc(c: &mut Criterion)176 pub fn parse_complex_with_sc(c: &mut Criterion) {
177 c.bench_function("parse_complex_with_sc", |b| {
178 b.iter(|| create_app!().get_matches_from(vec!["myprog", "subcmd"]))
179 });
180 }
181
parse_complex_with_sc_flag(c: &mut Criterion)182 pub fn parse_complex_with_sc_flag(c: &mut Criterion) {
183 c.bench_function("parse_complex_with_sc_flag", |b| {
184 b.iter(|| create_app!().get_matches_from(vec!["myprog", "subcmd", "-f"]))
185 });
186 }
187
parse_complex_with_sc_opt(c: &mut Criterion)188 pub fn parse_complex_with_sc_opt(c: &mut Criterion) {
189 c.bench_function("parse_complex_with_sc_opt", |b| {
190 b.iter(|| create_app!().get_matches_from(vec!["myprog", "subcmd", "-o", "option1"]))
191 });
192 }
193
parse_complex_with_sc_pos(c: &mut Criterion)194 pub fn parse_complex_with_sc_pos(c: &mut Criterion) {
195 c.bench_function("parse_complex_with_sc_pos", |b| {
196 b.iter(|| create_app!().get_matches_from(vec!["myprog", "subcmd", "arg1"]))
197 });
198 }
199
parse_complex1(c: &mut Criterion)200 pub fn parse_complex1(c: &mut Criterion) {
201 c.bench_function("parse_complex1", |b| {
202 b.iter(|| {
203 create_app!().get_matches_from(vec![
204 "myprog",
205 "-ff",
206 "-o",
207 "option1",
208 "arg1",
209 "-O",
210 "fast",
211 "arg2",
212 "--multvals",
213 "one",
214 "two",
215 "emacs",
216 ])
217 })
218 });
219 }
220
parse_complex2(c: &mut Criterion)221 pub fn parse_complex2(c: &mut Criterion) {
222 c.bench_function("parse_complex2", |b| {
223 b.iter(|| {
224 create_app!().get_matches_from(vec![
225 "myprog",
226 "arg1",
227 "-f",
228 "arg2",
229 "--long-option-2",
230 "some",
231 "-O",
232 "slow",
233 "--multvalsmo",
234 "one",
235 "two",
236 "--minvals2",
237 "3",
238 "2",
239 "1",
240 ])
241 })
242 });
243 }
244
parse_args_negate_scs(c: &mut Criterion)245 pub fn parse_args_negate_scs(c: &mut Criterion) {
246 c.bench_function("parse_args_negate_scs", |b| {
247 b.iter(|| {
248 create_app!()
249 .args_conflicts_with_subcommands(true)
250 .get_matches_from(vec![
251 "myprog",
252 "arg1",
253 "-f",
254 "arg2",
255 "--long-option-2",
256 "some",
257 "-O",
258 "slow",
259 "--multvalsmo",
260 "one",
261 "two",
262 "--minvals2",
263 "3",
264 "2",
265 "1",
266 ])
267 })
268 });
269 }
270
parse_complex_with_sc_complex(c: &mut Criterion)271 pub fn parse_complex_with_sc_complex(c: &mut Criterion) {
272 c.bench_function("parse_complex_with_sc_complex", |b| {
273 b.iter(|| {
274 create_app!().get_matches_from(vec!["myprog", "subcmd", "-f", "-o", "option1", "arg1"])
275 })
276 });
277 }
278
279 criterion_group!(
280 benches,
281 build_from_builder,
282 parse_complex,
283 parse_complex_with_flag,
284 parse_complex_with_opt,
285 parse_complex_with_pos,
286 parse_complex_with_sc,
287 parse_complex_with_sc_flag,
288 parse_complex_with_sc_opt,
289 parse_complex_with_sc_pos,
290 parse_complex1,
291 parse_complex2,
292 parse_args_negate_scs,
293 parse_complex_with_sc_complex
294 );
295
296 criterion_main!(benches);
297