diff --git a/.travis.yml b/.travis.yml index 669b59dca38..2ed95fb16f5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,8 +26,7 @@ branches: jobs: allow_failures: - rust: nightly - - env: - - SHARD=coverage + - name: Coverage fast_finish: true include: - os: osx @@ -36,8 +35,7 @@ jobs: - {} - rust: beta - rust: nightly - - env: - - SHARD=lint + - name: Linting (fmt + clippy) before_script: - rustup component add clippy - rustup component add rustfmt @@ -46,13 +44,10 @@ jobs: - cargo clippy --lib --features "yaml unstable" -- -D warnings - cargo clippy --tests --examples --features "yaml unstable" - cargo fmt -- --check - - rust: nightly - env: - - SHARD=bench + - name: Benchmarking script: - cargo bench - - env: - - SHARD=coverage + - name: Coverage addons: apt: packages: diff --git a/Cargo.toml b/Cargo.toml index ecbafd3bd58..402354787f8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,30 @@ categories = ["command-line-interface"] license = "MIT OR Apache-2.0" readme = "README.md" +[[bench]] +harness = false +name = "01_default" + +[[bench]] +harness = false +name = "02_simple" + +[[bench]] +harness = false +name = "03_complex" + +[[bench]] +harness = false +name = "04_new_help" + +[[bench]] +harness = false +name = "05_ripgrep" + +[[bench]] +harness = false +name = "06_rustup" + [badges] travis-ci = { repository = "clap-rs/clap", branch = "master" } azure-devops = { project = "clap-rs/clap", pipeline = "clap-rs.clap" } @@ -54,6 +78,7 @@ ansi_term = { version = "0.12.1", optional = true } regex = "1.0" lazy_static = "1" version-sync = "0.8" +criterion = "0.3" [features] default = ["suggestions", "color", "vec_map", "derive", "std"] diff --git a/benches/01_default.rs b/benches/01_default.rs index 0d0d4cd12c6..c985198cb30 100644 --- a/benches/01_default.rs +++ b/benches/01_default.rs @@ -1,14 +1,15 @@ -#![feature(test)] - use clap::App; -use test::Bencher; +use criterion::{criterion_group, criterion_main, Criterion}; -#[bench] -fn build_app(b: &mut Bencher) { - b.iter(|| App::new("claptests")); +pub fn empty_app(c: &mut Criterion) { + c.bench_function("build_app", |b| b.iter(|| App::new("claptests"))); } -#[bench] -fn parse_clean(b: &mut Bencher) { - b.iter(|| App::new("claptests").get_matches_from(vec![""])); +pub fn parse_clean(c: &mut Criterion) { + c.bench_function("parse_clean", |b| { + b.iter(|| App::new("claptests").get_matches_from(vec![""])) + }); } + +criterion_group!(benches, empty_app, parse_clean); +criterion_main!(benches); diff --git a/benches/02_simple.rs b/benches/02_simple.rs index f41efad40ee..5be52a594da 100644 --- a/benches/02_simple.rs +++ b/benches/02_simple.rs @@ -1,7 +1,5 @@ -#![feature(test)] - use clap::{App, Arg}; -use test::Bencher; +use criterion::{criterion_group, criterion_main, Criterion}; macro_rules! create_app { () => {{ @@ -15,95 +13,92 @@ macro_rules! create_app { }}; } -#[bench] -fn build_app(b: &mut Bencher) { - b.iter(|| create_app!()); +pub fn build_app(c: &mut Criterion) { + c.bench_function("build_app", |b| b.iter(|| create_app!())); } -#[bench] -fn add_flag(b: &mut Bencher) { - fn build_app() -> App<'static> { - App::new("claptests") - } - - b.iter(|| build_app().arg(Arg::from("-s, --some 'something'"))); +pub fn add_flag(c: &mut Criterion) { + c.bench_function("add_flag", |b| { + b.iter(|| App::new("claptests").arg(Arg::from("-s, --some 'something'"))) + }); } -#[bench] -fn add_flag_ref(b: &mut Bencher) { - fn build_app() -> App<'static> { - App::new("claptests") - } - - b.iter(|| { - let arg = Arg::from("-s, --some 'something'"); - build_app().arg(&arg) +pub fn add_flag_ref(c: &mut Criterion) { + c.bench_function("add_flag_ref", |b| { + b.iter(|| { + let arg = Arg::from("-s, --some 'something'"); + App::new("claptests").arg(&arg) + }) }); } -#[bench] -fn add_opt(b: &mut Bencher) { - fn build_app() -> App<'static> { - App::new("claptests") - } - - b.iter(|| build_app().arg(Arg::from("-s, --some 'something'"))); +pub fn add_opt(c: &mut Criterion) { + c.bench_function("add_opt", |b| { + b.iter(|| App::new("claptests").arg(Arg::from("-s, --some 'something'"))) + }); } -#[bench] -fn add_opt_ref(b: &mut Bencher) { - fn build_app() -> App<'static> { - App::new("claptests") - } - - b.iter(|| { - let arg = Arg::from("-s, --some 'something'"); - build_app().arg(&arg) +pub fn add_opt_ref(c: &mut Criterion) { + c.bench_function("add_opt_ref", |b| { + b.iter(|| { + let arg = Arg::from("-s, --some 'something'"); + App::new("claptests").arg(&arg) + }) }); } -#[bench] -fn add_pos(b: &mut Bencher) { - fn build_app() -> App<'static> { - App::new("claptests") - } - - b.iter(|| build_app().arg(Arg::with_name("some"))); +pub fn add_pos(c: &mut Criterion) { + c.bench_function("add_pos", |b| { + b.iter(|| App::new("claptests").arg(Arg::with_name("some"))) + }); } -#[bench] -fn add_pos_ref(b: &mut Bencher) { - fn build_app() -> App<'static> { - App::new("claptests") - } - - b.iter(|| { - let arg = Arg::with_name("some"); - build_app().arg(&arg) +pub fn add_pos_ref(c: &mut Criterion) { + c.bench_function("add_pos_ref", |b| { + b.iter(|| { + let arg = Arg::with_name("some"); + App::new("claptests").arg(&arg) + }) }); } -#[bench] -fn parse_clean(b: &mut Bencher) { - b.iter(|| create_app!().get_matches_from(vec![""])); +pub fn parse_flag(c: &mut Criterion) { + c.bench_function("parse_flag", |b| { + b.iter(|| create_app!().get_matches_from(vec!["myprog", "-f"])) + }); } -#[bench] -fn parse_flag(b: &mut Bencher) { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "-f"])); +pub fn parse_option(c: &mut Criterion) { + c.bench_function("parse_option", |b| { + b.iter(|| create_app!().get_matches_from(vec!["myprog", "-o", "option1"])) + }); } -#[bench] -fn parse_option(b: &mut Bencher) { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "-o", "option1"])); +pub fn parse_positional(c: &mut Criterion) { + c.bench_function("parse_positional", |b| { + b.iter(|| create_app!().get_matches_from(vec!["myprog", "arg1"])) + }); } -#[bench] -fn parse_positional(b: &mut Bencher) { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "arg1"])); +pub fn parse_complex(c: &mut Criterion) { + c.bench_function("parse_complex", |b| { + b.iter(|| create_app!().get_matches_from(vec!["myprog", "-o", "option1", "-f", "arg1"])) + }); } -#[bench] -fn parse_complex(b: &mut Bencher) { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "-o", "option1", "-f", "arg1"])); -} +criterion_group!( + benches, + parse_complex, + parse_positional, + parse_option, + parse_flag, + add_pos_ref, + add_pos, + add_opt_ref, + add_opt, + add_flag_ref, + add_flag, + build_app +); + +criterion_main!(benches); diff --git a/benches/03_complex.rs b/benches/03_complex.rs index b69a09885af..d31a938a996 100644 --- a/benches/03_complex.rs +++ b/benches/03_complex.rs @@ -1,7 +1,5 @@ -#![feature(test)] - use clap::{clap_app, App, AppSettings, Arg, ArgSettings}; -use test::Bencher; +use criterion::{criterion_group, criterion_main, Criterion}; static OPT3_VALS: [&str; 2] = ["fast", "slow"]; static POS3_VALS: [&str; 2] = ["vi", "emacs"]; @@ -43,251 +41,236 @@ macro_rules! create_app { }}; } -#[bench] -fn create_app_from_usage(b: &mut Bencher) { - b.iter(|| create_app!()); +pub fn create_app_from_usage(c: &mut Criterion) { + c.bench_function("create_app_from_usage", |b| b.iter(|| create_app!())); } -#[bench] -fn create_app_builder(b: &mut Bencher) { - b.iter(|| { - App::new("claptests") - .version("0.1") - .about("tests clap library") - .author("Kevin K. ") - .arg( - Arg::with_name("opt") - .help("tests options") - .short('o') - .long("option") - .setting(ArgSettings::MultipleValues) - .setting(ArgSettings::MultipleOccurrences), - ) - .arg( - Arg::with_name("positional") - .help("tests positionals") - .index(1), - ) - .arg( - Arg::with_name("flag") - .short('f') - .help("tests flags") - .long("flag") - .global(true) - .settings(&[ArgSettings::MultipleOccurrences]), - ) - .arg( - Arg::with_name("flag2") - .short('F') - .help("tests flags with exclusions") - .conflicts_with("flag") - .requires("option2"), - ) - .arg( - Arg::with_name("option2") - .help("tests long options with exclusions") - .conflicts_with("option") - .requires("positional2") - .setting(ArgSettings::TakesValue) - .long("long-option-2"), - ) - .arg( - Arg::with_name("positional2") - .index(3) - .help("tests positionals with exclusions"), - ) - .arg( - Arg::with_name("option3") - .short('O') - .long("Option") - .setting(ArgSettings::TakesValue) - .help("tests options with specific value sets") - .possible_values(&OPT3_VALS), - ) - .arg( - Arg::with_name("positional3") - .setting(ArgSettings::MultipleValues) - .setting(ArgSettings::MultipleOccurrences) - .help("tests positionals with specific values") - .index(4) - .possible_values(&POS3_VALS), - ) - .arg( - Arg::with_name("multvals") - .long("multvals") - .help("Tests mutliple values, not mult occs") - .value_names(&["one", "two"]), - ) - .arg( - Arg::with_name("multvalsmo") - .long("multvalsmo") - .setting(ArgSettings::MultipleValues) - .setting(ArgSettings::MultipleOccurrences) - .help("Tests mutliple values, not mult occs") - .value_names(&["one", "two"]), - ) - .arg( - Arg::with_name("minvals") - .long("minvals2") - .setting(ArgSettings::MultipleValues) - .setting(ArgSettings::MultipleOccurrences) - .help("Tests 2 min vals") - .min_values(2), - ) - .arg( - Arg::with_name("maxvals") - .long("maxvals3") - .setting(ArgSettings::MultipleValues) - .setting(ArgSettings::MultipleOccurrences) - .help("Tests 3 max vals") - .max_values(3), - ) - .subcommand( - App::new("subcmd") - .about("tests subcommands") - .version("0.1") - .author("Kevin K. ") - .arg( - Arg::with_name("scoption") - .short('o') - .long("option") - .setting(ArgSettings::MultipleValues) - .setting(ArgSettings::MultipleOccurrences) - .help("tests options"), - ) - .arg( - Arg::with_name("scpositional") - .index(1) - .help("tests positionals"), - ), - ); +pub fn create_app_builder(c: &mut Criterion) { + c.bench_function("create_app_builder", |b| { + b.iter(|| { + App::new("claptests") + .version("0.1") + .about("tests clap library") + .author("Kevin K. ") + .arg( + Arg::with_name("opt") + .help("tests options") + .short('o') + .long("option") + .setting(ArgSettings::MultipleValues) + .setting(ArgSettings::MultipleOccurrences), + ) + .arg( + Arg::with_name("positional") + .help("tests positionals") + .index(1), + ) + .arg( + Arg::with_name("flag") + .short('f') + .help("tests flags") + .long("flag") + .global(true) + .settings(&[ArgSettings::MultipleOccurrences]), + ) + .arg( + Arg::with_name("flag2") + .short('F') + .help("tests flags with exclusions") + .conflicts_with("flag") + .requires("option2"), + ) + .arg( + Arg::with_name("option2") + .help("tests long options with exclusions") + .conflicts_with("option") + .requires("positional2") + .setting(ArgSettings::TakesValue) + .long("long-option-2"), + ) + .arg( + Arg::with_name("positional2") + .index(3) + .help("tests positionals with exclusions"), + ) + .arg( + Arg::with_name("option3") + .short('O') + .long("Option") + .setting(ArgSettings::TakesValue) + .help("tests options with specific value sets") + .possible_values(&OPT3_VALS), + ) + .arg( + Arg::with_name("positional3") + .setting(ArgSettings::MultipleValues) + .setting(ArgSettings::MultipleOccurrences) + .help("tests positionals with specific values") + .index(4) + .possible_values(&POS3_VALS), + ) + .arg( + Arg::with_name("multvals") + .long("multvals") + .help("Tests mutliple values, not mult occs") + .value_names(&["one", "two"]), + ) + .arg( + Arg::with_name("multvalsmo") + .long("multvalsmo") + .setting(ArgSettings::MultipleValues) + .setting(ArgSettings::MultipleOccurrences) + .help("Tests mutliple values, not mult occs") + .value_names(&["one", "two"]), + ) + .arg( + Arg::with_name("minvals") + .long("minvals2") + .setting(ArgSettings::MultipleValues) + .setting(ArgSettings::MultipleOccurrences) + .help("Tests 2 min vals") + .min_values(2), + ) + .arg( + Arg::with_name("maxvals") + .long("maxvals3") + .setting(ArgSettings::MultipleValues) + .setting(ArgSettings::MultipleOccurrences) + .help("Tests 3 max vals") + .max_values(3), + ) + .subcommand( + App::new("subcmd") + .about("tests subcommands") + .version("0.1") + .author("Kevin K. ") + .arg( + Arg::with_name("scoption") + .short('o') + .long("option") + .setting(ArgSettings::MultipleValues) + .setting(ArgSettings::MultipleOccurrences) + .help("tests options"), + ) + .arg( + Arg::with_name("scpositional") + .index(1) + .help("tests positionals"), + ), + ) + }) }); } -#[bench] -fn create_app_macros(b: &mut Bencher) { - b.iter(|| { - clap_app!(claptests => - (version: "0.1") - (about: "tests clap library") - (author: "Kevin K. ") - (@arg opt: -o --option +takes_value ... "tests options") - (@arg positional: index(1) "tests positionals") - (@arg flag: -f --flag ... +global "tests flags") - (@arg flag2: -F conflicts_with[flag] requires[option2] - "tests flags with exclusions") - (@arg option2: --long_option_2 conflicts_with[option] requires[positional2] - "tests long options with exclusions") - (@arg positional2: index(2) "tests positionals with exclusions") - (@arg option3: -O --Option +takes_value possible_value[fast slow] - "tests options with specific value sets") - (@arg positional3: index(3) ... possible_value[vi emacs] - "tests positionals with specific values") - (@arg multvals: --multvals +takes_value value_name[one two] - "Tests mutliple values, not mult occs") - (@arg multvalsmo: --multvalsmo ... +takes_value value_name[one two] - "Tests mutliple values, not mult occs") - (@arg minvals: --minvals2 min_values(1) ... +takes_value "Tests 2 min vals") - (@arg maxvals: --maxvals3 ... +takes_value max_values(3) "Tests 3 max vals") - (@subcommand subcmd => - (about: "tests subcommands") +pub fn create_app_macros(c: &mut Criterion) { + c.bench_function("create_app_macros", |b| { + b.iter(|| { + clap_app!(claptests => (version: "0.1") + (about: "tests clap library") (author: "Kevin K. ") - (@arg scoption: -o --option ... +takes_value "tests options") - (@arg scpositional: index(1) "tests positionals")) - ); + (@arg opt: -o --option +takes_value ... "tests options") + (@arg positional: index(1) "tests positionals") + (@arg flag: -f --flag ... +global "tests flags") + (@arg flag2: -F conflicts_with[flag] requires[option2] + "tests flags with exclusions") + (@arg option2: --long_option_2 conflicts_with[option] requires[positional2] + "tests long options with exclusions") + (@arg positional2: index(2) "tests positionals with exclusions") + (@arg option3: -O --Option +takes_value possible_value[fast slow] + "tests options with specific value sets") + (@arg positional3: index(3) ... possible_value[vi emacs] + "tests positionals with specific values") + (@arg multvals: --multvals +takes_value value_name[one two] + "Tests mutliple values, not mult occs") + (@arg multvalsmo: --multvalsmo ... +takes_value value_name[one two] + "Tests mutliple values, not mult occs") + (@arg minvals: --minvals2 min_values(1) ... +takes_value "Tests 2 min vals") + (@arg maxvals: --maxvals3 ... +takes_value max_values(3) "Tests 3 max vals") + (@subcommand subcmd => + (about: "tests subcommands") + (version: "0.1") + (author: "Kevin K. ") + (@arg scoption: -o --option ... +takes_value "tests options") + (@arg scpositional: index(1) "tests positionals")) + ); + }) }); } -#[bench] -fn parse_clean(b: &mut Bencher) { - b.iter(|| create_app!().get_matches_from(vec![""])); -} - -#[bench] -fn parse_flag(b: &mut Bencher) { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "-f"])); +pub fn parse_clean(c: &mut Criterion) { + c.bench_function("parse_clean", |b| { + b.iter(|| create_app!().get_matches_from(vec![""])) + }); } -#[bench] -fn parse_option(b: &mut Bencher) { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "-o", "option1"])); +pub fn parse_flag(c: &mut Criterion) { + c.bench_function("parse_flag", |b| { + b.iter(|| create_app!().get_matches_from(vec!["myprog", "-f"])) + }); } -#[bench] -fn parse_positional(b: &mut Bencher) { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "arg1"])); +pub fn parse_option(c: &mut Criterion) { + c.bench_function("parse_option", |b| { + b.iter(|| create_app!().get_matches_from(vec!["myprog", "-o", "option1"])) + }); } -#[bench] -fn parse_sc_clean(b: &mut Bencher) { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "subcmd"])); +pub fn parse_positional(c: &mut Criterion) { + c.bench_function("parse_positional", |b| { + b.iter(|| create_app!().get_matches_from(vec!["myprog", "arg1"])) + }); } -#[bench] -fn parse_sc_flag(b: &mut Bencher) { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "subcmd", "-f"])); +pub fn parse_sc_clean(c: &mut Criterion) { + c.bench_function("parse_sc_clean", |b| { + b.iter(|| create_app!().get_matches_from(vec!["myprog", "subcmd"])) + }); } -#[bench] -fn parse_sc_option(b: &mut Bencher) { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "subcmd", "-o", "option1"])); +pub fn parse_sc_flag(c: &mut Criterion) { + c.bench_function("parse_sc_complex", |b| { + b.iter(|| create_app!().get_matches_from(vec!["myprog", "subcmd", "-f"])) + }); } -#[bench] -fn parse_sc_positional(b: &mut Bencher) { - b.iter(|| create_app!().get_matches_from(vec!["myprog", "subcmd", "arg1"])); +pub fn parse_sc_option(c: &mut Criterion) { + c.bench_function("parse_sc_option", |b| { + b.iter(|| create_app!().get_matches_from(vec!["myprog", "subcmd", "-o", "option1"])) + }); } -#[bench] -fn parse_complex1(b: &mut Bencher) { - b.iter(|| { - create_app!().get_matches_from(vec![ - "myprog", - "-ff", - "-o", - "option1", - "arg1", - "-O", - "fast", - "arg2", - "--multvals", - "one", - "two", - "emacs", - ]) +pub fn parse_sc_positional(c: &mut Criterion) { + c.bench_function("parse_sc_positional", |b| { + b.iter(|| create_app!().get_matches_from(vec!["myprog", "subcmd", "arg1"])) }); } -#[bench] -fn parse_complex2(b: &mut Bencher) { - 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_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", + ]) + }) }); } -#[bench] -fn parse_complex2_with_args_negate_scs(b: &mut Bencher) { - b.iter(|| { - create_app!() - .setting(AppSettings::ArgsNegateSubcommands) - .get_matches_from(vec![ +pub fn parse_complex2(c: &mut Criterion) { + c.bench_function("parse_complex2", |b| { + b.iter(|| { + create_app!().get_matches_from(vec![ "myprog", "arg1", "-f", @@ -304,12 +287,61 @@ fn parse_complex2_with_args_negate_scs(b: &mut Bencher) { "2", "1", ]) + }) + }); +} + +pub fn parse_complex2_with_args_negate_scs(c: &mut Criterion) { + c.bench_function("parse_complex2_with_args_negate_scs", |b| { + b.iter(|| { + create_app!() + .setting(AppSettings::ArgsNegateSubcommands) + .get_matches_from(vec![ + "myprog", + "arg1", + "-f", + "arg2", + "--long-option-2", + "some", + "-O", + "slow", + "--multvalsmo", + "one", + "two", + "--minvals2", + "3", + "2", + "1", + ]) + }) }); } -#[bench] -fn parse_sc_complex(b: &mut Bencher) { - b.iter(|| { - create_app!().get_matches_from(vec!["myprog", "subcmd", "-f", "-o", "option1", "arg1"]) +pub fn parse_sc_complex(c: &mut Criterion) { + c.bench_function("parse_sc_complex", |b| { + b.iter(|| { + create_app!().get_matches_from(vec!["myprog", "subcmd", "-f", "-o", "option1", "arg1"]) + }) }); } + +criterion_group!( + benches, + create_app_from_usage, + create_app_builder, + create_app_macros, + parse_clean, + parse_flag, + parse_option, + parse_positional, + parse_sc_clean, + parse_sc_flag, + parse_sc_option, + parse_sc_positional, + parse_complex1, + parse_complex2, + parse_complex2_with_args_negate_scs, + parse_sc_complex +); + +criterion_main!(benches); diff --git a/benches/04_new_help.rs b/benches/04_new_help.rs index 5810de6c608..343bea7f54d 100644 --- a/benches/04_new_help.rs +++ b/benches/04_new_help.rs @@ -1,9 +1,7 @@ -#![feature(test)] - use clap::App; use clap::{Arg, ArgSettings}; +use criterion::{criterion_group, criterion_main, Criterion}; use std::io::Cursor; -use test::Bencher; fn build_help(app: &mut App) -> String { let mut buf = Cursor::new(Vec::with_capacity(50)); @@ -158,62 +156,68 @@ fn app_example10<'c>() -> App<'c> { ) } -#[bench] -fn example1(b: &mut Bencher) { +pub fn example1(c: &mut Criterion) { let mut app = app_example1(); - b.iter(|| build_help(&mut app)); + c.bench_function("example1", |b| b.iter(|| build_help(&mut app))); } -#[bench] -fn example2(b: &mut Bencher) { +pub fn example2(c: &mut Criterion) { let mut app = app_example2(); - b.iter(|| build_help(&mut app)); + c.bench_function("example2", |b| b.iter(|| build_help(&mut app))); } -#[bench] -fn example3(b: &mut Bencher) { +pub fn example3(c: &mut Criterion) { let mut app = app_example3(); - b.iter(|| build_help(&mut app)); + c.bench_function("example3", |b| b.iter(|| build_help(&mut app))); } -#[bench] -fn example4(b: &mut Bencher) { +pub fn example4(c: &mut Criterion) { let mut app = app_example4(); - b.iter(|| build_help(&mut app)); + c.bench_function("example4", |b| b.iter(|| build_help(&mut app))); } -#[bench] -fn example5(b: &mut Bencher) { +pub fn example5(c: &mut Criterion) { let mut app = app_example5(); - b.iter(|| build_help(&mut app)); + c.bench_function("example5", |b| b.iter(|| build_help(&mut app))); } -#[bench] -fn example6(b: &mut Bencher) { +pub fn example6(c: &mut Criterion) { let mut app = app_example6(); - b.iter(|| build_help(&mut app)); + c.bench_function("example6", |b| b.iter(|| build_help(&mut app))); } -#[bench] -fn example7(b: &mut Bencher) { +pub fn example7(c: &mut Criterion) { let mut app = app_example7(); - b.iter(|| build_help(&mut app)); + c.bench_function("example7", |b| b.iter(|| build_help(&mut app))); } -#[bench] -fn example8(b: &mut Bencher) { +pub fn example8(c: &mut Criterion) { let mut app = app_example8(); - b.iter(|| build_help(&mut app)); + c.bench_function("example8", |b| b.iter(|| build_help(&mut app))); } -#[bench] -fn example10(b: &mut Bencher) { +pub fn example10(c: &mut Criterion) { let mut app = app_example10(); - b.iter(|| build_help(&mut app)); + c.bench_function("example10", |b| b.iter(|| build_help(&mut app))); } -#[bench] -fn example4_template(b: &mut Bencher) { +pub fn example4_template(c: &mut Criterion) { let mut app = app_example4().help_template("{bin} {version}\n{author}\n{about}\n\nUSAGE:\n {usage}\n\nFLAGS:\n{flags}\n\nARGS:\n{args}\n"); - b.iter(|| build_help(&mut app)); -} + c.bench_function("example4_template", |b| b.iter(|| build_help(&mut app))); +} + +criterion_group!( + benches, + example1, + example2, + example3, + example4, + example5, + example6, + example7, + example8, + example10, + example4_template +); + +criterion_main!(benches); diff --git a/benches/05_ripgrep.rs b/benches/05_ripgrep.rs index 1e8d571f5c9..b7d87bf2949 100644 --- a/benches/05_ripgrep.rs +++ b/benches/05_ripgrep.rs @@ -3,226 +3,239 @@ // // CLI used is adapted from ripgrep 48a8a3a691220f9e5b2b08f4051abe8655ea7e8a -#![feature(test)] - use clap::{App, AppSettings, Arg, ArgSettings}; +use criterion::{criterion_group, criterion_main, Criterion}; use std::collections::HashMap; use std::io::Cursor; -use test::Bencher; use lazy_static::lazy_static; -#[bench] -fn build_app_short(b: &mut Bencher) { - b.iter(app_short); +pub fn build_app_short(c: &mut Criterion) { + c.bench_function("build_app_short", |b| b.iter(app_short)); } -#[bench] -fn build_app_long(b: &mut Bencher) { - b.iter(app_long); +pub fn build_app_long(c: &mut Criterion) { + c.bench_function("build_app_long", |b| b.iter(app_long)); } -#[bench] -fn build_help_short(b: &mut Bencher) { +pub fn build_help_short(c: &mut Criterion) { let mut app = app_short(); - b.iter(|| build_help(&mut app)); + c.bench_function("build_help_short", |b| b.iter(|| build_help(&mut app))); } -#[bench] -fn build_help_long(b: &mut Bencher) { +pub fn build_help_long(c: &mut Criterion) { let mut app = app_long(); - b.iter(|| build_help(&mut app)); + c.bench_function("build_help_long", |b| b.iter(|| build_help(&mut app))); } -#[bench] -fn parse_clean(b: &mut Bencher) { - b.iter(|| app_short().get_matches_from(vec!["rg", "pat"])); +pub fn parse_clean(c: &mut Criterion) { + c.bench_function("parse_clean", |b| { + b.iter(|| app_short().get_matches_from(vec!["rg", "pat"])) + }); } -#[bench] -fn parse_complex(b: &mut Bencher) { - 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_complex(c: &mut Criterion) { + c.bench_function("parse_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", + ]) + }) }); } -#[bench] -fn parse_lots(b: &mut Bencher) { - 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", - ]) +pub fn parse_lots(c: &mut Criterion) { + c.bench_function("parse_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", + ]) + }) }); } @@ -257,12 +270,12 @@ OPTIONS: {unified}"; /// Build a clap application with short help strings. -pub fn app_short() -> App<'static> { +fn app_short() -> App<'static> { app(false, |k| USAGES[k].short) } /// Build a clap application with long help strings. -pub fn app_long() -> App<'static> { +fn app_long() -> App<'static> { app(true, |k| USAGES[k].long) } @@ -926,3 +939,15 @@ fn validate_number(s: String) -> Result<(), String> { .map(|_| ()) .map_err(|err| err.to_string()) } + +criterion_group!( + benches, + build_app_short, + build_app_long, + build_help_short, + build_help_long, + parse_clean, + parse_complex, + parse_lots +); +criterion_main!(benches); diff --git a/benches/06_rustup.rs b/benches/06_rustup.rs index f526af8957b..4c1b507a0de 100644 --- a/benches/06_rustup.rs +++ b/benches/06_rustup.rs @@ -2,27 +2,29 @@ // // CLI used is from rustup 408ed84f0e50511ed44a405dd91365e5da588790 -#![feature(test)] - use clap::{App, AppSettings, Arg, ArgGroup, ArgSettings}; -use test::Bencher; +use criterion::{criterion_group, criterion_main, Criterion}; + +criterion_group!(benches, build_app, parse_clean, parse_subcommands); +criterion_main!(benches); -#[bench] -fn build_app(b: &mut Bencher) { - b.iter(build_cli); +pub fn build_app(c: &mut Criterion) { + c.bench_function("build_app", |b| b.iter(build_cli)); } -#[bench] -fn parse_clean(b: &mut Bencher) { - b.iter(|| build_cli().get_matches_from(vec![""])); +pub fn parse_clean(c: &mut Criterion) { + c.bench_function("parse_clean", |b| { + b.iter(|| build_cli().get_matches_from(vec![""])) + }); } -#[bench] -fn parse_subcommands(b: &mut Bencher) { - b.iter(|| build_cli().get_matches_from(vec!["rustup override add stable"])); +pub fn parse_subcommands(c: &mut Criterion) { + c.bench_function("parse_subcommands", |b| { + b.iter(|| build_cli().get_matches_from(vec!["rustup override add stable"])) + }); } -pub fn build_cli() -> App<'static> { +fn build_cli() -> App<'static> { App::new("rustup") .version("0.9.0") // Simulating .about("The Rust toolchain installer") @@ -455,90 +457,3 @@ default browser. By default, it opens the documentation index. Use the various flags to open specific pieces of documentation."; - -static COMPLETIONS_HELP: &str = r" -One can generate a completion script for `rustup` that is compatible with -a given shell. The script is output on `stdout` allowing one to re-direct -the output to the file of their choosing. Where you place the file will -depend on which shell, and which operating system you are using. Your -particular configuration may also determine where these scripts need -to be placed. - -Here are some common set ups for the three supported shells under -Unix and similar operating systems (such as GNU/Linux). - -BASH: - -Completion files are commonly stored in `/usr/share/bash-completion/completions` - -Run the command: - -`rustup completions bash > /usr/share/bash-completion/completions/rustup.bash` - -This installs the completion script. You may have to log out and log -back in to your shell session for the changes to take affect. - -FISH: - -Fish completion files are commonly stored in -`$HOME/.config/fish/completions` - -Run the command: -`rustup completions fish > ~/.config/fish/completions/rustup.fish` - -This installs the completion script. You may have to log out and log -back in to your shell session for the changes to take affect. - -ZSH: - -ZSH completions are commonly stored in any directory listed in your -`$fpath` variable. To use these completions, you must either add the -generated script to one of those directories, or add your own -to this list. - -Adding a custom directory is often the safest best if you're unsure -of which directory to use. First create the directory, for this -example we'll create a hidden directory inside our `$HOME` directory - -`mkdir ~/.zfunc` - -Then add the following lines to your `.zshrc` just before `compinit` - -`fpath+=~/.zfunc` - -Now you can install the completions script using the following command - -`rustup completions zsh > ~/.zfunc/_rustup` - -You must then either log out and log back in, or simply run - -`exec zsh` - -For the new completions to take affect. - -CUSTOM LOCATIONS: - -Alternatively, you could save these files to the place of your choosing, -such as a custom directory inside your $HOME. Doing so will require you -to add the proper directives, such as `source`ing inside your login -script. Consult your shells documentation for how to add such directives. - -POWERSHELL: - -The powershell completion scripts require PowerShell v5.0+ (which comes -Windows 10, but can be downloaded separately for windows 7 or 8.1). - -First, check if a profile has already been set - -`PS C:\> Test-Path $profile` - -If the above command returns `False` run the following - -`PS C:\> New-Item -path $profile -type file --force` - -Now open the file provided by `$profile` (if you used the `New-Item` command -it will be `%USERPROFILE%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1` - -Next, we either save the completions file into our profile, or into a separate file -and source it inside our profile. To save the completions into our profile simply -use";