From 9f89e8429d9014df8493a22bddfde98d7da57814 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Wed, 7 Feb 2024 15:16:38 -0600 Subject: [PATCH] test(bench): Switch to divan --- Cargo.lock | 327 ++++------------------------ crates/benchmarks/Cargo.toml | 2 +- crates/benchmarks/benches/cargo.rs | 94 +++++--- crates/benchmarks/benches/linear.rs | 133 ++++++----- 4 files changed, 168 insertions(+), 388 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 32419424..38c66a22 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,12 +11,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "anes" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" - [[package]] name = "anstream" version = "0.3.1" @@ -93,18 +87,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "bumpalo" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" - -[[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.73" @@ -127,33 +109,6 @@ dependencies = [ "num-traits", ] -[[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 = "clap" version = "4.0.32" @@ -167,6 +122,7 @@ dependencies = [ "once_cell", "strsim", "termcolor", + "terminal_size", ] [[package]] @@ -198,92 +154,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] -name = "criterion" -version = "0.5.1" +name = "condtype" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" -dependencies = [ - "anes", - "cast", - "ciborium", - "clap", - "criterion-plot", - "is-terminal", - "itertools", - "num-traits", - "once_cell", - "oorandom", - "plotters", - "rayon", - "regex", - "serde", - "serde_derive", - "serde_json", - "tinytemplate", - "walkdir", -] +checksum = "baf0a07a401f374238ab8e2f11a104d2851bf9ce711ec69804834de8af45c7af" [[package]] -name = "criterion-plot" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" -dependencies = [ - "cast", - "itertools", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.2" +name = "crossbeam-utils" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" +checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" dependencies = [ "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", + "once_cell", ] [[package]] -name = "crossbeam-epoch" -version = "0.9.10" +name = "divan" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" +checksum = "5398159ee27f2b123d89b856bad61725442f37df5fb98c30cd570c318d594aee" dependencies = [ - "autocfg", "cfg-if", - "crossbeam-utils", - "memoffset", - "once_cell", - "scopeguard", + "clap", + "condtype", + "divan-macros", + "libc", + "regex-lite", ] [[package]] -name = "crossbeam-utils" -version = "0.8.11" +name = "divan-macros" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc" +checksum = "5092f66eb3563a01e85552731ae82c04c934ff4efd7ad1a0deae7b948f4b3ec4" dependencies = [ - "cfg-if", - "once_cell", + "proc-macro2", + "quote", + "syn 2.0.41", ] -[[package]] -name = "either" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" - [[package]] name = "equivalent" version = "1.0.0" @@ -348,12 +258,6 @@ dependencies = [ "regex", ] -[[package]] -name = "half" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" - [[package]] name = "hashbrown" version = "0.14.0" @@ -450,30 +354,12 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" -[[package]] -name = "js-sys" -version = "0.3.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" -dependencies = [ - "wasm-bindgen", -] - [[package]] name = "kstring" version = "2.0.0" @@ -497,9 +383,9 @@ checksum = "baff4b617f7df3d896f97fe922b64817f6cd9a756bb81d40f8883f2f66dcb401" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libfuzzer-sys" @@ -554,15 +440,6 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - [[package]] name = "normalize-line-endings" version = "0.3.0" @@ -604,46 +481,12 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" -[[package]] -name = "oorandom" -version = "11.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" - [[package]] name = "os_str_bytes" version = "6.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" -[[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 = "proc-macro-error" version = "1.0.4" @@ -686,30 +529,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rayon" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" -dependencies = [ - "autocfg", - "crossbeam-deque", - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "num_cpus", -] - [[package]] name = "regex" version = "1.6.0" @@ -721,6 +540,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.6.27" @@ -762,12 +587,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - [[package]] name = "serde" version = "1.0.193" @@ -896,6 +715,16 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "terminal_size" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e6bf6f19e9f8ed8d4048dc22981458ebcf406d67e94cd422e5ecd73d63b3237" +dependencies = [ + "rustix", + "windows-sys 0.48.0", +] + [[package]] name = "thread_local" version = "1.1.4" @@ -914,16 +743,6 @@ dependencies = [ "num_cpus", ] -[[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 = "toml" version = "0.5.10" @@ -985,7 +804,7 @@ dependencies = [ name = "toml_benchmarks" version = "0.0.0" dependencies = [ - "criterion", + "divan", "lexopt", "serde", "serde_json", @@ -1055,70 +874,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "wasm-bindgen" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 1.0.105", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.105", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" - -[[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 = "winapi" version = "0.3.9" diff --git a/crates/benchmarks/Cargo.toml b/crates/benchmarks/Cargo.toml index 5f00d9a5..c2a65280 100644 --- a/crates/benchmarks/Cargo.toml +++ b/crates/benchmarks/Cargo.toml @@ -9,13 +9,13 @@ rust-version.workspace = true release = false [dev-dependencies] -criterion = "0.5.1" toml = { path = "../toml" } toml_edit = { path = "../toml_edit" } toml_old = { version = "0.5.10", package = "toml" } serde = { version = "1.0.160", features = ["derive"] } serde_json = "1.0.96" lexopt = "0.3.0" +divan = "0.1.11" [[bench]] name = "cargo" diff --git a/crates/benchmarks/benches/cargo.rs b/crates/benchmarks/benches/cargo.rs index c31e5572..ae403f6c 100644 --- a/crates/benchmarks/benches/cargo.rs +++ b/crates/benchmarks/benches/cargo.rs @@ -1,39 +1,69 @@ -use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; - -fn cargo_manifest(c: &mut Criterion) { - let mut group = c.benchmark_group("cargo_manifest"); - for (name, sample) in MANIFESTS { - let len = sample.len(); - group.throughput(Throughput::Bytes(len as u64)); - - group.bench_with_input(BenchmarkId::new("toml_edit", name), &len, |b, _| { - sample.parse::().unwrap(); - b.iter(|| sample.parse::()); - }); - group.bench_with_input(BenchmarkId::new("toml::Value", name), &len, |b, _| { - sample.parse::().unwrap(); - b.iter(|| sample.parse::()); - }); - group.bench_with_input(BenchmarkId::new("toml::de", name), &len, |b, _| { - toml::from_str::(sample).unwrap(); - b.iter(|| toml::from_str::(sample)); - }); - group.bench_with_input(BenchmarkId::new("toml_old::Value", name), &len, |b, _| { - sample.parse::().unwrap(); - b.iter(|| sample.parse::()); - }); - group.bench_with_input(BenchmarkId::new("toml_old::de", name), &len, |b, _| { - toml_old::from_str::(sample).unwrap(); - b.iter(|| toml_old::from_str::(sample)); - }); +mod toml_edit { + use super::*; + + #[divan::bench(args=MANIFESTS)] + fn document(sample: &Data) -> ::toml_edit::Document { + sample.content().parse().unwrap() + } + + #[divan::bench(args=MANIFESTS)] + fn manifest(sample: &Data) -> manifest::Manifest { + ::toml_edit::de::from_str(sample.content()).unwrap() } - group.finish(); } -criterion_group!(benches, cargo_manifest); -criterion_main!(benches); +mod toml { + use super::*; + + #[divan::bench(args=MANIFESTS)] + fn document(sample: &Data) -> ::toml::Value { + sample.content().parse().unwrap() + } + + #[divan::bench(args=MANIFESTS)] + fn manifest(sample: &Data) -> manifest::Manifest { + ::toml::de::from_str(sample.content()).unwrap() + } +} + +mod toml_v05 { + use super::*; + + #[divan::bench(args=MANIFESTS)] + fn document(sample: &Data) -> ::toml_old::Value { + sample.content().parse().unwrap() + } + + #[divan::bench(args=MANIFESTS)] + fn manifest(sample: &Data) -> manifest::Manifest { + ::toml_old::de::from_str(sample.content()).unwrap() + } +} + +fn main() { + divan::main(); +} + +#[derive(Debug)] +pub struct Data(&'static str, &'static str); + +impl Data { + pub const fn name(&self) -> &'static str { + self.0 + } + + pub const fn content(&self) -> &'static str { + self.1 + } +} + +impl std::fmt::Display for Data { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.name().fmt(f) + } +} -const MANIFESTS: &[(&str, &str)] = &[("minimal", MINIMAL), ("medium", MEDIUM)]; +const MANIFESTS: &[Data] = &[Data("0-minimal", MINIMAL), Data("1-medium", MEDIUM)]; const MINIMAL: &str = r#" [package] diff --git a/crates/benchmarks/benches/linear.rs b/crates/benchmarks/benches/linear.rs index 90a8dcb9..ae95db02 100644 --- a/crates/benchmarks/benches/linear.rs +++ b/crates/benchmarks/benches/linear.rs @@ -1,84 +1,79 @@ -use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion, Throughput}; +const NUM_ENTRIES: &[usize] = &[10, 100]; -fn map(c: &mut Criterion) { - let mut group = c.benchmark_group("map"); - let samples = [10, 100]; - for sample in samples { +mod map { + use super::*; + + #[divan::bench(args = NUM_ENTRIES)] + fn toml_edit(bencher: divan::Bencher, num_entries: usize) { + bencher + .with_inputs(|| gen(num_entries)) + .input_counter(divan::counter::BytesCount::of_str) + .bench_values(|sample| sample.parse::().unwrap()) + } + + #[divan::bench(args = NUM_ENTRIES)] + fn toml(bencher: divan::Bencher, num_entries: usize) { + bencher + .with_inputs(|| gen(num_entries)) + .input_counter(divan::counter::BytesCount::of_str) + .bench_values(|sample| sample.parse::().unwrap()) + } + + #[divan::bench(args = NUM_ENTRIES)] + fn toml_v05(bencher: divan::Bencher, num_entries: usize) { + bencher + .with_inputs(|| gen(num_entries)) + .input_counter(divan::counter::BytesCount::of_str) + .bench_values(|sample| sample.parse::().unwrap()) + } + + fn gen(num_entries: usize) -> String { let mut s = String::new(); - for i in 0..sample { + for i in 0..num_entries { s += &format!("[header_no_{}]\n", i); s += "entry = 42\n" } - let len = s.len(); - group.throughput(Throughput::Bytes(len as u64)); - - group.bench_with_input(BenchmarkId::new("toml_edit", sample), &sample, |b, _| { - let s = s.clone(); - s.parse::().unwrap(); - let s = black_box(s); - b.iter(|| { - black_box(s.parse::().unwrap()); - }) - }); - group.bench_with_input(BenchmarkId::new("toml", sample), &sample, |b, _| { - let s = s.clone(); - s.parse::().unwrap(); - let s = black_box(s); - b.iter(|| { - black_box(s.parse::().unwrap()); - }) - }); - group.bench_with_input(BenchmarkId::new("toml-v0.5", sample), &sample, |b, _| { - let s = s.clone(); - s.parse::().unwrap(); - let s = black_box(s); - b.iter(|| { - black_box(s.parse::().unwrap()); - }) - }); + s } - group.finish(); } -fn array(c: &mut Criterion) { - let mut group = c.benchmark_group("array"); - let samples = [10, 100]; - for sample in samples { +mod array { + use super::*; + + #[divan::bench(args = NUM_ENTRIES)] + fn toml_edit(bencher: divan::Bencher, num_entries: usize) { + bencher + .with_inputs(|| gen(num_entries)) + .input_counter(divan::counter::BytesCount::of_str) + .bench_values(|sample| sample.parse::().unwrap()) + } + + #[divan::bench(args = NUM_ENTRIES)] + fn toml(bencher: divan::Bencher, num_entries: usize) { + bencher + .with_inputs(|| gen(num_entries)) + .input_counter(divan::counter::BytesCount::of_str) + .bench_values(|sample| sample.parse::().unwrap()) + } + + #[divan::bench(args = NUM_ENTRIES)] + fn toml_v05(bencher: divan::Bencher, num_entries: usize) { + bencher + .with_inputs(|| gen(num_entries)) + .input_counter(divan::counter::BytesCount::of_str) + .bench_values(|sample| sample.parse::().unwrap()) + } + + fn gen(num_entries: usize) -> String { let mut s = String::new(); - for _ in 0..sample { + for _ in 0..num_entries { s += "[[header]]\n"; s += "entry = 42\n" } - let len = s.len(); - group.throughput(Throughput::Bytes(len as u64)); - - group.bench_with_input(BenchmarkId::new("toml_edit", sample), &sample, |b, _| { - let s = s.clone(); - s.parse::().unwrap(); - let s = black_box(s); - b.iter(|| { - black_box(s.parse::().unwrap()); - }) - }); - group.bench_with_input(BenchmarkId::new("toml", sample), &sample, |b, _| { - let s = s.clone(); - s.parse::().unwrap(); - let s = black_box(s); - b.iter(|| { - black_box(s.parse::().unwrap()); - }) - }); - group.bench_with_input(BenchmarkId::new("toml-v0.5", sample), &sample, |b, _| { - let s = s.clone(); - s.parse::().unwrap(); - let s = black_box(s); - b.iter(|| { - black_box(s.parse::().unwrap()); - }) - }); + s } - group.finish(); } -criterion_group!(benches, map, array); -criterion_main!(benches); +fn main() { + divan::main(); +}