From b0fea2bac60819bdb042e10c032817fded67f815 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Thu, 8 Feb 2024 06:04:16 -0600 Subject: [PATCH 1/2] test(bench): Switch to divan --- Cargo.lock | 174 ++----- clap_bench/Cargo.toml | 22 +- clap_bench/benches/01_default.rs | 15 - clap_bench/benches/02_simple.rs | 104 ---- clap_bench/benches/03_complex.rs | 296 ------------ clap_bench/benches/04_new_help.rs | 220 --------- clap_bench/benches/complex.rs | 136 ++++++ clap_bench/benches/empty.rs | 33 ++ .../benches/{05_ripgrep.rs => ripgrep.rs} | 450 +++++++++--------- .../benches/{06_rustup.rs => rustup.rs} | 34 +- clap_bench/benches/simple.rs | 52 ++ 11 files changed, 500 insertions(+), 1036 deletions(-) delete mode 100644 clap_bench/benches/01_default.rs delete mode 100644 clap_bench/benches/02_simple.rs delete mode 100644 clap_bench/benches/03_complex.rs delete mode 100644 clap_bench/benches/04_new_help.rs create mode 100644 clap_bench/benches/complex.rs create mode 100644 clap_bench/benches/empty.rs rename clap_bench/benches/{05_ripgrep.rs => ripgrep.rs} (58%) rename clap_bench/benches/{06_rustup.rs => rustup.rs} (96%) create mode 100644 clap_bench/benches/simple.rs diff --git a/Cargo.lock b/Cargo.lock index 216a4de6..21fc942d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -75,12 +75,6 @@ dependencies = [ "libc", ] -[[package]] -name = "anes" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" - [[package]] name = "ansi-str" version = "0.8.0" @@ -310,12 +304,6 @@ dependencies = [ "zip", ] -[[package]] -name = "cast" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" - [[package]] name = "cc" version = "1.0.83" @@ -398,33 +386,6 @@ dependencies = [ "phf_codegen", ] -[[package]] -name = "ciborium" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c137568cc60b904a7724001b35ce2630fd00d5d84805fbb608ab89509d788f" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346de753af073cc87b52b2083a506b38ac176a44cfb05497b622e27be899b369" - -[[package]] -name = "ciborium-ll" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213030a2b5a4e0c0892b6652260cf6ccac84827b83a85a534e178e3906c4cf1b" -dependencies = [ - "ciborium-io", - "half", -] - [[package]] name = "clang-sys" version = "1.6.1" @@ -464,7 +425,7 @@ name = "clap_bench" version = "0.0.0" dependencies = [ "clap 4.4.18", - "criterion", + "divan", "lazy_static", ] @@ -633,6 +594,12 @@ dependencies = [ "vt100", ] +[[package]] +name = "condtype" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf0a07a401f374238ab8e2f11a104d2851bf9ce711ec69804834de8af45c7af" + [[package]] name = "console" version = "0.15.7" @@ -709,42 +676,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "criterion" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" -dependencies = [ - "anes", - "cast", - "ciborium", - "clap 4.4.17", - "criterion-plot", - "is-terminal", - "itertools 0.10.5", - "num-traits", - "once_cell", - "oorandom", - "plotters", - "rayon", - "regex", - "serde", - "serde_derive", - "serde_json", - "tinytemplate", - "walkdir", -] - -[[package]] -name = "criterion-plot" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" -dependencies = [ - "cast", - "itertools 0.10.5", -] - [[package]] name = "crossbeam-channel" version = "0.5.6" @@ -894,6 +825,31 @@ dependencies = [ "winapi", ] +[[package]] +name = "divan" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5398159ee27f2b123d89b856bad61725442f37df5fb98c30cd570c318d594aee" +dependencies = [ + "cfg-if", + "clap 4.4.17", + "condtype", + "divan-macros", + "libc", + "regex-lite", +] + +[[package]] +name = "divan-macros" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5092f66eb3563a01e85552731ae82c04c934ff4efd7ad1a0deae7b948f4b3ec4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "dtparse" version = "2.0.0" @@ -1147,12 +1103,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" -[[package]] -name = "half" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" - [[package]] name = "hamcrest2" version = "0.3.0" @@ -2273,12 +2223,6 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" -[[package]] -name = "oorandom" -version = "11.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" - [[package]] name = "open" version = "5.0.0" @@ -2517,34 +2461,6 @@ version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" -[[package]] -name = "plotters" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b639e642295546c50fcd545198c9d64ee2a38620a628724a3b266d5fbf97" -dependencies = [ - "num-traits", - "plotters-backend", - "plotters-svg", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "plotters-backend" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142" - -[[package]] -name = "plotters-svg" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f" -dependencies = [ - "plotters-backend", -] - [[package]] name = "pori" version = "0.0.0" @@ -2802,6 +2718,12 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "regex-lite" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e" + [[package]] name = "regex-syntax" version = "0.8.2" @@ -3375,16 +3297,6 @@ dependencies = [ "time-core", ] -[[package]] -name = "tinytemplate" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" -dependencies = [ - "serde", - "serde_json", -] - [[package]] name = "tinyvec" version = "1.6.0" @@ -3925,16 +3837,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "web-sys" -version = "0.3.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "which" version = "4.4.0" diff --git a/clap_bench/Cargo.toml b/clap_bench/Cargo.toml index ddab748f..97ba0eff 100644 --- a/clap_bench/Cargo.toml +++ b/clap_bench/Cargo.toml @@ -13,35 +13,25 @@ release = false [dev-dependencies] clap = { path = "../", version = "4.0.0", default-features = false, features = ["std", "help"] } -criterion = "0.5.1" +divan = "0.1.11" lazy_static = "1.4.0" [[bench]] harness = false -name = "01_default" -path = "benches/01_default.rs" +name = "empty" [[bench]] harness = false -name = "02_simple" -path = "benches/02_simple.rs" +name = "simple" [[bench]] harness = false -name = "03_complex" -path = "benches/03_complex.rs" +name = "complex" [[bench]] harness = false -name = "04_new_help" -path = "benches/04_new_help.rs" +name = "rustup" [[bench]] harness = false -name = "05_ripgrep" -path = "benches/05_ripgrep.rs" - -[[bench]] -harness = false -name = "06_rustup" -path = "benches/06_rustup.rs" +name = "ripgrep" diff --git a/clap_bench/benches/01_default.rs b/clap_bench/benches/01_default.rs deleted file mode 100644 index 620b32b8..00000000 --- a/clap_bench/benches/01_default.rs +++ /dev/null @@ -1,15 +0,0 @@ -use clap::Command; -use criterion::{criterion_group, criterion_main, Criterion}; - -pub fn build_empty(c: &mut Criterion) { - c.bench_function("build_empty", |b| b.iter(|| Command::new("claptests"))); -} - -pub fn parse_empty(c: &mut Criterion) { - c.bench_function("parse_empty", |b| { - b.iter(|| Command::new("claptests").get_matches_from(vec![""])) - }); -} - -criterion_group!(benches, build_empty, parse_empty); -criterion_main!(benches); diff --git a/clap_bench/benches/02_simple.rs b/clap_bench/benches/02_simple.rs deleted file mode 100644 index 2b448ea9..00000000 --- a/clap_bench/benches/02_simple.rs +++ /dev/null @@ -1,104 +0,0 @@ -use clap::{arg, Arg, Command}; -use criterion::{criterion_group, criterion_main, Criterion}; - -macro_rules! create_app { - () => {{ - Command::new("claptests") - .version("0.1") - .about("tests clap library") - .author("Kevin K. ") - .arg(arg!(-f --flag "tests flags")) - .arg(arg!(-o --option "tests options")) - .arg(arg!([positional] "tests positional")) - }}; -} - -pub fn build_simple(c: &mut Criterion) { - c.bench_function("build_simple", |b| b.iter(|| create_app!())); -} - -pub fn build_with_flag(c: &mut Criterion) { - c.bench_function("build_with_flag", |b| { - b.iter(|| Command::new("claptests").arg(arg!(-s --some "something"))) - }); -} - -pub fn build_with_flag_ref(c: &mut Criterion) { - c.bench_function("build_with_flag_ref", |b| { - b.iter(|| { - let arg = arg!(-s --some "something"); - Command::new("claptests").arg(&arg) - }) - }); -} - -pub fn build_with_opt(c: &mut Criterion) { - c.bench_function("build_with_opt", |b| { - b.iter(|| Command::new("claptests").arg(arg!(-s --some "something").required(true))) - }); -} - -pub fn build_with_opt_ref(c: &mut Criterion) { - c.bench_function("build_with_opt_ref", |b| { - b.iter(|| { - let arg = arg!(-s --some "something").required(true); - Command::new("claptests").arg(&arg) - }) - }); -} - -pub fn build_with_pos(c: &mut Criterion) { - c.bench_function("build_with_pos", |b| { - b.iter(|| Command::new("claptests").arg(Arg::new("some"))) - }); -} - -pub fn build_with_pos_ref(c: &mut Criterion) { - c.bench_function("build_with_pos_ref", |b| { - b.iter(|| { - let arg = Arg::new("some"); - Command::new("claptests").arg(&arg) - }) - }); -} - -pub fn parse_simple_with_flag(c: &mut Criterion) { - c.bench_function("parse_simple_with_flag", |b| { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "-f"])) - }); -} - -pub fn parse_simple_with_opt(c: &mut Criterion) { - c.bench_function("parse_simple_with_opt", |b| { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "-o", "option1"])) - }); -} - -pub fn parse_simple_with_pos(c: &mut Criterion) { - c.bench_function("parse_simple_with_pos", |b| { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "arg1"])) - }); -} - -pub fn parse_simple_with_complex(c: &mut Criterion) { - c.bench_function("parse_simple_with_complex", |b| { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "-o", "option1", "-f", "arg1"])) - }); -} - -criterion_group!( - benches, - parse_simple_with_complex, - parse_simple_with_pos, - parse_simple_with_opt, - parse_simple_with_flag, - build_with_pos_ref, - build_with_pos, - build_with_opt_ref, - build_with_opt, - build_with_flag_ref, - build_with_flag, - build_simple -); - -criterion_main!(benches); diff --git a/clap_bench/benches/03_complex.rs b/clap_bench/benches/03_complex.rs deleted file mode 100644 index dc708e61..00000000 --- a/clap_bench/benches/03_complex.rs +++ /dev/null @@ -1,296 +0,0 @@ -use clap::{arg, Arg, ArgAction, Command}; -use criterion::{criterion_group, criterion_main, Criterion}; - -static OPT3_VALS: [&str; 2] = ["fast", "slow"]; -static POS3_VALS: [&str; 2] = ["vi", "emacs"]; - -macro_rules! create_app { - () => {{ - Command::new("claptests") - .version("0.1") - .about("tests clap library") - .author("Kevin K. ") - .arg(arg!(-o --option ... "tests options")) - .arg(arg!([positional] "tests positionals")) - .arg(arg!(-f --flag ... "tests flags").global(true)) - .args([ - arg!(flag2: -F "tests flags with exclusions") - .conflicts_with("flag") - .requires("option2"), - arg!(option2: --"long-option-2" "tests long options with exclusions") - .conflicts_with("option") - .requires("positional2"), - arg!([positional2] "tests positionals with exclusions"), - arg!(-O --Option "tests options with specific value sets") - .value_parser(OPT3_VALS), - arg!([positional3] ... "tests positionals with specific values") - .value_parser(POS3_VALS), - arg!(--multvals "Tests multiple values not mult occs").value_names(["one", "two"]), - arg!( - --multvalsmo "Tests multiple values, not mult occs" - ).required(false).value_names(["one", "two"]), - arg!(--minvals2 ... "Tests 2 min vals").num_args(2..), - arg!(--maxvals3 ... "Tests 3 max vals").num_args(1..=3), - ]) - .subcommand( - Command::new("subcmd") - .about("tests subcommands") - .version("0.1") - .author("Kevin K. ") - .arg(arg!(-o --option ... "tests options")) - .arg(arg!([scpositional] "tests positionals")) - ) - }}; -} - -pub fn build_from_builder(c: &mut Criterion) { - c.bench_function("build_from_builder", |b| { - b.iter(|| { - Command::new("claptests") - .version("0.1") - .about("tests clap library") - .author("Kevin K. ") - .arg( - Arg::new("opt") - .help("tests options") - .short('o') - .long("option") - .num_args(1..) - .action(ArgAction::Append), - ) - .arg(Arg::new("positional").help("tests positionals").index(1)) - .arg( - Arg::new("flag") - .short('f') - .help("tests flags") - .long("flag") - .global(true) - .action(ArgAction::Count), - ) - .arg( - Arg::new("flag2") - .short('F') - .help("tests flags with exclusions") - .action(ArgAction::SetTrue) - .conflicts_with("flag") - .requires("option2"), - ) - .arg( - Arg::new("option2") - .help("tests long options with exclusions") - .conflicts_with("option") - .requires("positional2") - .action(ArgAction::Set) - .long("long-option-2"), - ) - .arg( - Arg::new("positional2") - .index(3) - .help("tests positionals with exclusions"), - ) - .arg( - Arg::new("option3") - .short('O') - .long("Option") - .action(ArgAction::Set) - .help("tests options with specific value sets") - .value_parser(OPT3_VALS), - ) - .arg( - Arg::new("positional3") - .num_args(1..) - .help("tests positionals with specific values") - .index(4) - .value_parser(POS3_VALS), - ) - .arg( - Arg::new("multvals") - .long("multvals") - .help("Tests multiple values, not mult occs") - .value_names(["one", "two"]), - ) - .arg( - Arg::new("multvalsmo") - .long("multvalsmo") - .action(ArgAction::Append) - .help("Tests multiple values, not mult occs") - .value_names(["one", "two"]), - ) - .arg( - Arg::new("minvals") - .long("minvals2") - .action(ArgAction::Append) - .help("Tests 2 min vals") - .num_args(2..), - ) - .arg( - Arg::new("maxvals") - .long("maxvals3") - .action(ArgAction::Append) - .help("Tests 3 max vals") - .num_args(1..=3), - ) - .subcommand( - Command::new("subcmd") - .about("tests subcommands") - .version("0.1") - .author("Kevin K. ") - .arg( - Arg::new("scoption") - .short('o') - .long("option") - .num_args(1..) - .action(ArgAction::Append) - .help("tests options"), - ) - .arg(Arg::new("scpositional").index(1).help("tests positionals")), - ) - }) - }); -} - -pub fn parse_complex(c: &mut Criterion) { - c.bench_function("parse_complex", |b| { - b.iter(|| create_app!().get_matches_from(vec![""])) - }); -} - -pub fn parse_complex_with_flag(c: &mut Criterion) { - c.bench_function("parse_complex_with_flag", |b| { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "-f"])) - }); -} - -pub fn parse_complex_with_opt(c: &mut Criterion) { - c.bench_function("parse_complex_with_opt", |b| { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "-o", "option1"])) - }); -} - -pub fn parse_complex_with_pos(c: &mut Criterion) { - c.bench_function("parse_complex_with_pos", |b| { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "arg1"])) - }); -} - -pub fn parse_complex_with_sc(c: &mut Criterion) { - c.bench_function("parse_complex_with_sc", |b| { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "subcmd"])) - }); -} - -pub fn parse_complex_with_sc_flag(c: &mut Criterion) { - c.bench_function("parse_complex_with_sc_flag", |b| { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "subcmd", "-f"])) - }); -} - -pub fn parse_complex_with_sc_opt(c: &mut Criterion) { - c.bench_function("parse_complex_with_sc_opt", |b| { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "subcmd", "-o", "option1"])) - }); -} - -pub fn parse_complex_with_sc_pos(c: &mut Criterion) { - c.bench_function("parse_complex_with_sc_pos", |b| { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "subcmd", "arg1"])) - }); -} - -pub fn parse_complex1(c: &mut Criterion) { - c.bench_function("parse_complex1", |b| { - b.iter(|| { - create_app!().get_matches_from(vec![ - "myprog", - "-ff", - "-o", - "option1", - "arg1", - "-O", - "fast", - "arg2", - "--multvals", - "one", - "two", - "emacs", - ]) - }) - }); -} - -pub fn parse_complex2(c: &mut Criterion) { - c.bench_function("parse_complex2", |b| { - b.iter(|| { - create_app!().get_matches_from(vec![ - "myprog", - "arg1", - "-f", - "arg2", - "--long-option-2", - "some", - "-O", - "slow", - "--multvalsmo", - "one", - "two", - "--minvals2", - "3", - "2", - "1", - ]) - }) - }); -} - -pub fn parse_args_negate_scs(c: &mut Criterion) { - c.bench_function("parse_args_negate_scs", |b| { - b.iter(|| { - create_app!() - .args_conflicts_with_subcommands(true) - .get_matches_from(vec![ - "myprog", - "arg1", - "-f", - "arg2", - "--long-option-2", - "some", - "-O", - "slow", - "--multvalsmo", - "one", - "two", - "--minvals2", - "3", - "2", - "1", - ]) - }) - }); -} - -pub fn parse_complex_with_sc_complex(c: &mut Criterion) { - c.bench_function("parse_complex_with_sc_complex", |b| { - b.iter(|| { - create_app!().get_matches_from(vec!["myprog", "subcmd", "-f", "-o", "option1", "arg1"]) - }) - }); -} - -criterion_group!( - benches, - build_from_builder, - parse_complex, - parse_complex_with_flag, - parse_complex_with_opt, - parse_complex_with_pos, - parse_complex_with_sc, - parse_complex_with_sc_flag, - parse_complex_with_sc_opt, - parse_complex_with_sc_pos, - parse_complex1, - parse_complex2, - parse_args_negate_scs, - parse_complex_with_sc_complex -); - -criterion_main!(benches); diff --git a/clap_bench/benches/04_new_help.rs b/clap_bench/benches/04_new_help.rs deleted file mode 100644 index dfb2157e..00000000 --- a/clap_bench/benches/04_new_help.rs +++ /dev/null @@ -1,220 +0,0 @@ -use clap::Command; -use clap::{arg, Arg, ArgAction}; -use criterion::{criterion_group, criterion_main, Criterion}; - -fn build_help(cmd: &mut Command) -> String { - let help = cmd.render_help(); - help.to_string() -} - -fn app_example1() -> Command { - Command::new("MyApp") - .version("1.0") - .author("Kevin K. ") - .about("Does awesome things") - .arg( - arg!( - -c --config "Sets a custom config file" - ) - .required(false), - ) - .arg(arg!( "Sets an optional output file")) - .arg(arg!(d: -d ... "Turn debugging information on")) - .subcommand( - Command::new("test") - .about("does testing things") - .arg(arg!(-l --list "lists test values")), - ) -} - -fn app_example2() -> Command { - Command::new("MyApp") - .version("1.0") - .author("Kevin K. ") - .about("Does awesome things") -} - -fn app_example3() -> Command { - Command::new("MyApp") - .arg( - Arg::new("debug") - .help("turn on debugging information") - .short('d') - .action(ArgAction::SetTrue), - ) - .args([ - Arg::new("config") - .help("sets the config file to use") - .action(ArgAction::Set) - .short('c') - .long("config"), - Arg::new("input") - .help("the input file to use") - .required(true), - ]) - .arg(arg!(--license "display the license file")) - .arg(arg!([output] "Supply an output file to use")) - .arg( - arg!( - -i --int "Set an interface to use" - ) - .required(false), - ) -} - -fn app_example4() -> Command { - Command::new("MyApp") - .about("Parses an input file to do awesome things") - .version("1.0") - .author("Kevin K. ") - .arg( - Arg::new("debug") - .help("turn on debugging information") - .short('d') - .action(ArgAction::SetTrue) - .long("debug"), - ) - .arg( - Arg::new("config") - .help("sets the config file to use") - .short('c') - .long("config"), - ) - .arg( - Arg::new("input") - .help("the input file to use") - .index(1) - .required(true), - ) -} - -fn app_example5() -> Command { - Command::new("MyApp").arg( - Arg::new("awesome") - .help("turns up the awesome") - .short('a') - .long("awesome") - .action(ArgAction::Count), - ) -} - -fn app_example6() -> Command { - Command::new("MyApp") - .arg( - Arg::new("input") - .help("the input file to use") - .index(1) - .requires("config") - .required(true), - ) - .arg(Arg::new("config").help("the config file to use").index(2)) -} - -fn app_example7() -> Command { - Command::new("MyApp") - .arg(Arg::new("config")) - .arg(Arg::new("output")) - .arg( - Arg::new("input") - .help("the input file to use") - .num_args(1..) - .action(ArgAction::Append) - .required(true) - .short('i') - .long("input") - .requires("config") - .conflicts_with("output"), - ) -} - -fn app_example8() -> Command { - Command::new("MyApp") - .arg(Arg::new("config")) - .arg(Arg::new("output")) - .arg( - Arg::new("input") - .help("the input file to use") - .num_args(1..) - .action(ArgAction::Append) - .required(true) - .short('i') - .long("input") - .requires("config") - .conflicts_with("output"), - ) -} - -fn app_example10() -> Command { - Command::new("myapp").about("does awesome things").arg( - Arg::new("CONFIG") - .help("The config file to use (default is \"config.json\")") - .short('c') - .action(ArgAction::Set), - ) -} - -pub fn example1(c: &mut Criterion) { - let mut cmd = app_example1(); - c.bench_function("example1", |b| b.iter(|| build_help(&mut cmd))); -} - -pub fn example2(c: &mut Criterion) { - let mut cmd = app_example2(); - c.bench_function("example2", |b| b.iter(|| build_help(&mut cmd))); -} - -pub fn example3(c: &mut Criterion) { - let mut cmd = app_example3(); - c.bench_function("example3", |b| b.iter(|| build_help(&mut cmd))); -} - -pub fn example4(c: &mut Criterion) { - let mut cmd = app_example4(); - c.bench_function("example4", |b| b.iter(|| build_help(&mut cmd))); -} - -pub fn example5(c: &mut Criterion) { - let mut cmd = app_example5(); - c.bench_function("example5", |b| b.iter(|| build_help(&mut cmd))); -} - -pub fn example6(c: &mut Criterion) { - let mut cmd = app_example6(); - c.bench_function("example6", |b| b.iter(|| build_help(&mut cmd))); -} - -pub fn example7(c: &mut Criterion) { - let mut cmd = app_example7(); - c.bench_function("example7", |b| b.iter(|| build_help(&mut cmd))); -} - -pub fn example8(c: &mut Criterion) { - let mut cmd = app_example8(); - c.bench_function("example8", |b| b.iter(|| build_help(&mut cmd))); -} - -pub fn example10(c: &mut Criterion) { - let mut cmd = app_example10(); - c.bench_function("example10", |b| b.iter(|| build_help(&mut cmd))); -} - -pub fn example4_template(c: &mut Criterion) { - let mut cmd = app_example4().help_template("{name} {version}\n{author}\n{about}\n\nUSAGE:\n {usage}\n\nOPTIONS:\n{options}\n\nARGS:\n{args}\n"); - c.bench_function("example4_template", |b| b.iter(|| build_help(&mut cmd))); -} - -criterion_group!( - benches, - example1, - example2, - example3, - example4, - example5, - example6, - example7, - example8, - example10, - example4_template -); - -criterion_main!(benches); diff --git a/clap_bench/benches/complex.rs b/clap_bench/benches/complex.rs new file mode 100644 index 00000000..6327a3b7 --- /dev/null +++ b/clap_bench/benches/complex.rs @@ -0,0 +1,136 @@ +use clap::{arg, ArgMatches, Command}; + +macro_rules! create_app { + () => {{ + Command::new("claptests") + .version("0.1") + .about("tests clap library") + .author("Kevin K. ") + .arg(arg!(-o --option ... "tests options")) + .arg(arg!([positional] "tests positionals")) + .arg(arg!(-f --flag ... "tests flags").global(true)) + .args([ + arg!(flag2: -F "tests flags with exclusions") + .conflicts_with("flag") + .requires("option2"), + arg!(option2: --"long-option-2" "tests long options with exclusions") + .conflicts_with("option") + .requires("positional2"), + arg!([positional2] "tests positionals with exclusions"), + arg!(-O --Option "tests options with specific value sets") + .value_parser(["fast", "slow"]), + arg!([positional3] ... "tests positionals with specific values") + .value_parser(["vi", "emacs"]), + arg!(--multvals "Tests multiple values not mult occs").value_names(["one", "two"]), + arg!( + --multvalsmo "Tests multiple values, not mult occs" + ).required(false).value_names(["one", "two"]), + arg!(--minvals2 ... "Tests 2 min vals").num_args(2..), + arg!(--maxvals3 ... "Tests 3 max vals").num_args(1..=3), + ]) + .subcommand( + Command::new("subcmd") + .about("tests subcommands") + .version("0.1") + .author("Kevin K. ") + .arg(arg!(-o --option ... "tests options")) + .arg(arg!([scpositional] "tests positionals")) + ) + }}; +} + +#[divan::bench] +fn build() -> Command { + create_app!() +} + +#[divan::bench(args=COMPLEX_ARGS)] +fn startup(args: &Args) -> ArgMatches { + create_app!().get_matches_from(args.args()) +} + +#[divan::bench] +fn render_help(bencher: divan::Bencher) { + let mut cmd = create_app!(); + bencher.bench_local(|| build_help(&mut cmd)); +} + +fn build_help(cmd: &mut Command) -> String { + let help = cmd.render_help(); + help.to_string() +} + +const COMPLEX_ARGS: &[Args] = &[ + Args("empty", &[""]), + Args("flag", &["myprog", "-f"]), + Args("opt", &["myprog", "-o", "option1"]), + Args("pos", &["myprog", "arg1"]), + Args("sc", &["myprog", "subcmd"]), + Args("sc_flag", &["myprog", "subcmd", "-f"]), + Args("sc_opt", &["myprog", "subcmd", "-o", "option1"]), + Args("sc_pos", &["myprog", "subcmd", "arg1"]), + Args( + "sc_nested", + &["myprog", "subcmd", "-f", "-o", "option1", "arg1"], + ), + Args( + "mixed1", + &[ + "myprog", + "-ff", + "-o", + "option1", + "arg1", + "-O", + "fast", + "arg2", + "--multvals", + "one", + "two", + "emacs", + ], + ), + Args( + "mixed2", + &[ + "myprog", + "arg1", + "-f", + "arg2", + "--long-option-2", + "some", + "-O", + "slow", + "--multvalsmo", + "one", + "two", + "--minvals2", + "3", + "2", + "1", + ], + ), +]; + +#[derive(Debug)] +pub struct Args(&'static str, &'static [&'static str]); + +impl Args { + pub const fn name(&self) -> &'static str { + self.0 + } + + pub const fn args(&self) -> &[&str] { + self.1 + } +} + +impl std::fmt::Display for Args { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.name().fmt(f) + } +} + +fn main() { + divan::main(); +} diff --git a/clap_bench/benches/empty.rs b/clap_bench/benches/empty.rs new file mode 100644 index 00000000..359ce5bc --- /dev/null +++ b/clap_bench/benches/empty.rs @@ -0,0 +1,33 @@ +use clap::ArgMatches; +use clap::Command; + +macro_rules! create_app { + () => {{ + Command::new("claptests") + }}; +} + +#[divan::bench] +fn build() -> Command { + create_app!() +} + +#[divan::bench] +fn startup() -> ArgMatches { + create_app!().get_matches_from(vec![""]) +} + +#[divan::bench] +fn render_help(bencher: divan::Bencher) { + let mut cmd = create_app!(); + bencher.bench_local(|| build_help(&mut cmd)); +} + +fn build_help(cmd: &mut Command) -> String { + let help = cmd.render_help(); + help.to_string() +} + +fn main() { + divan::main(); +} diff --git a/clap_bench/benches/05_ripgrep.rs b/clap_bench/benches/ripgrep.rs similarity index 58% rename from clap_bench/benches/05_ripgrep.rs rename to clap_bench/benches/ripgrep.rs index 00662ea5..1ec422af 100644 --- a/clap_bench/benches/05_ripgrep.rs +++ b/clap_bench/benches/ripgrep.rs @@ -3,239 +3,231 @@ // // CLI used is adapted from ripgrep 48a8a3a691220f9e5b2b08f4051abe8655ea7e8a -use clap::{value_parser, Arg, ArgAction, Command}; -use criterion::{criterion_group, criterion_main, Criterion}; use std::collections::HashMap; +use clap::{value_parser, Arg, ArgAction, ArgMatches, Command}; use lazy_static::lazy_static; -pub fn build_rg_with_short_help(c: &mut Criterion) { - c.bench_function("build_rg_with_short_help", |b| b.iter(app_short)); +mod build { + use super::*; + + #[divan::bench] + fn short_help() -> Command { + app_short() + } + + #[divan::bench] + fn long_help() -> Command { + app_long() + } } -pub fn build_rg_with_long_help(c: &mut Criterion) { - c.bench_function("build_rg_with_long_help", |b| b.iter(app_long)); +mod render_help { + use super::*; + + #[divan::bench] + fn short_help(bencher: divan::Bencher) { + let mut cmd = app_short(); + bencher.bench_local(|| build_help(&mut cmd)); + } + + #[divan::bench] + fn long_help(bencher: divan::Bencher) { + let mut cmd = app_long(); + bencher.bench_local(|| build_help(&mut cmd)); + } } -pub fn write_rg_short_help(c: &mut Criterion) { - let mut cmd = app_short(); - c.bench_function("write_rg_short_help", |b| b.iter(|| build_help(&mut cmd))); -} +mod startup { + use super::*; -pub fn write_rg_long_help(c: &mut Criterion) { - let mut cmd = app_long(); - c.bench_function("write_rg_long_help", |b| b.iter(|| build_help(&mut cmd))); -} + #[divan::bench] + fn simple() -> ArgMatches { + app_short().get_matches_from(vec!["rg", "pat"]) + } -pub fn parse_rg(c: &mut Criterion) { - c.bench_function("parse_rg", |b| { - b.iter(|| app_short().get_matches_from(vec!["rg", "pat"])) - }); -} + #[divan::bench] + fn complex() -> ArgMatches { + app_short().get_matches_from(vec![ + "rg", + "pat", + "-cFlN", + "-pqr=some", + "--null", + "--no-filename", + "--no-messages", + "-SH", + "-C5", + "--follow", + "-e some", + ]) + } -pub fn parse_rg_with_complex(c: &mut Criterion) { - c.bench_function("parse_rg_with_complex", |b| { - b.iter(|| { - app_short().get_matches_from(vec![ - "rg", - "pat", - "-cFlN", - "-pqr=some", - "--null", - "--no-filename", - "--no-messages", - "-SH", - "-C5", - "--follow", - "-e some", - ]) - }) - }); -} - -pub fn parse_rg_with_lots(c: &mut Criterion) { - c.bench_function("parse_rg_with_lots", |b| { - b.iter(|| { - app_short().get_matches_from(vec![ - "rg", "pat", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", - "some", "some", "some", "some", "some", "some", - ]) - }) - }); + #[divan::bench] + fn xargs() -> ArgMatches { + app_short().get_matches_from(vec![ + "rg", "pat", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", "some", + "some", "some", "some", "some", "some", "some", "some", + ]) + } } const ABOUT: &str = " @@ -929,14 +921,6 @@ lazy_static! { }; } -criterion_group!( - benches, - build_rg_with_short_help, - build_rg_with_long_help, - write_rg_short_help, - write_rg_long_help, - parse_rg, - parse_rg_with_complex, - parse_rg_with_lots -); -criterion_main!(benches); +fn main() { + divan::main(); +} diff --git a/clap_bench/benches/06_rustup.rs b/clap_bench/benches/rustup.rs similarity index 96% rename from clap_bench/benches/06_rustup.rs rename to clap_bench/benches/rustup.rs index 93df47fb..bdec47be 100644 --- a/clap_bench/benches/06_rustup.rs +++ b/clap_bench/benches/rustup.rs @@ -2,23 +2,25 @@ // // CLI used is from rustup 408ed84f0e50511ed44a405dd91365e5da588790 -use clap::{Arg, ArgAction, ArgGroup, Command}; -use criterion::{criterion_group, criterion_main, Criterion}; +use clap::{Arg, ArgAction, ArgGroup, ArgMatches, Command}; -pub fn build_rustup(c: &mut Criterion) { - c.bench_function("build_rustup", |b| b.iter(build_cli)); +#[divan::bench] +fn build() -> Command { + build_cli() } -pub fn parse_rustup(c: &mut Criterion) { - c.bench_function("parse_rustup", |b| { - b.iter(|| build_cli().get_matches_from(vec![""])) - }); -} +mod startup { + use super::*; -pub fn parse_rustup_with_sc(c: &mut Criterion) { - c.bench_function("parse_rustup_with_sc", |b| { - b.iter(|| build_cli().get_matches_from(vec!["rustup override add stable"])) - }); + #[divan::bench] + fn empty() -> ArgMatches { + build_cli().get_matches_from([""]) + } + + #[divan::bench] + fn sc() -> ArgMatches { + build_cli().get_matches_from(["rustup override add stable"]) + } } fn build_cli() -> Command { @@ -435,6 +437,6 @@ default browser. By default, it opens the documentation index. Use the various flags to open specific pieces of documentation."; -criterion_group!(benches, build_rustup, parse_rustup, parse_rustup_with_sc); - -criterion_main!(benches); +fn main() { + divan::main(); +} diff --git a/clap_bench/benches/simple.rs b/clap_bench/benches/simple.rs new file mode 100644 index 00000000..6065011c --- /dev/null +++ b/clap_bench/benches/simple.rs @@ -0,0 +1,52 @@ +use clap::{arg, ArgMatches, Command}; + +macro_rules! create_app { + () => {{ + Command::new("claptests") + .version("0.1") + .about("tests clap library") + .author("Kevin K. ") + .arg(arg!(-f --flag "tests flags")) + .arg(arg!(-o --option "tests options")) + .arg(arg!([positional] "tests positional")) + }}; +} + +#[divan::bench] +fn build() -> Command { + create_app!() +} + +mod startup { + use super::*; + + #[divan::bench] + fn flag() -> ArgMatches { + create_app!().get_matches_from(vec!["myprog", "-f"]) + } + + #[divan::bench] + fn opt() -> ArgMatches { + create_app!().get_matches_from(vec!["myprog", "-o", "option1"]) + } + + #[divan::bench] + fn pos() -> ArgMatches { + create_app!().get_matches_from(vec!["myprog", "arg1"]) + } +} + +#[divan::bench] +fn render_help(bencher: divan::Bencher) { + let mut cmd = create_app!(); + bencher.bench_local(|| build_help(&mut cmd)); +} + +fn build_help(cmd: &mut Command) -> String { + let help = cmd.render_help(); + help.to_string() +} + +fn main() { + divan::main(); +} From ea77b98da3f321069ae136a241a2d266c2b28bd7 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Thu, 8 Feb 2024 06:19:06 -0600 Subject: [PATCH 2/2] test(complete): Make it order independent --- clap_complete/tests/testsuite/bash.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/clap_complete/tests/testsuite/bash.rs b/clap_complete/tests/testsuite/bash.rs index 937f112c..61f6ef12 100644 --- a/clap_complete/tests/testsuite/bash.rs +++ b/clap_complete/tests/testsuite/bash.rs @@ -222,7 +222,6 @@ fn complete() { ); } - // Issue 5313 (https://github.com/clap-rs/clap/issues/5313) { use std::fs::File; use std::path::Path; @@ -234,13 +233,11 @@ fn complete() { File::create(Path::new(testdir_path).join("baz\tqux.txt")).unwrap(); let input = format!( - "exhaustive hint --file {}/\t\t", + "exhaustive hint --file {}/b\t", testdir_path.to_string_lossy() ); - let expected = r#"% -foo bar.txt baz^Iqux.txt "#; let actual = runtime.complete(input.as_str(), &term).unwrap(); - snapbox::assert_eq(expected, actual); + assert!(!actual.contains("foo"), "Actual output:\n{actual}"); } let input = "exhaustive hint --other \t";