From cf4708bb67d595b5cae3ee52fe1fff4577d71c14 Mon Sep 17 00:00:00 2001 From: Marijn Schouten Date: Wed, 25 Jun 2025 14:15:21 +0000 Subject: [PATCH] change benches to using criterion --- Cargo.lock | 580 +++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 7 + benches/benches.rs | 296 ++++++++++++++--------- 3 files changed, 770 insertions(+), 113 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f8473de..451aee8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,10 +2,350 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anes" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + +[[package]] +name = "ciborium" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" +dependencies = [ + "ciborium-io", + "ciborium-ll", + "serde", +] + +[[package]] +name = "ciborium-io" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" + +[[package]] +name = "ciborium-ll" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" +dependencies = [ + "ciborium-io", + "half", +] + +[[package]] +name = "clap" +version = "4.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" +dependencies = [ + "anstyle", + "clap_lex", +] + +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + +[[package]] +name = "criterion" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf7af66b0989381bd0be551bd7cc91912a655a58c6918420c9527b1fd8b4679" +dependencies = [ + "anes", + "cast", + "ciborium", + "clap", + "criterion-plot", + "itertools 0.13.0", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "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-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "half" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "oorandom" +version = "11.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" + +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-svg" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + [[package]] name = "rustc-literal-escaper" version = "0.0.4" dependencies = [ + "criterion", "rustc-std-workspace-core", "rustc-std-workspace-std", ] @@ -21,3 +361,243 @@ name = "rustc-std-workspace-std" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aba676a20abe46e5b0f1b0deae474aaaf31407e6c71147159890574599da04ef" + +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "syn" +version = "2.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[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 = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" diff --git a/Cargo.toml b/Cargo.toml index 6201905..89f9400 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,5 +10,12 @@ repository = "https://github.com/rust-lang/literal-escaper" std = { version = '1.0.0', optional = true, package = 'rustc-std-workspace-std' } core = { version = '1.0.0', optional = true, package = 'rustc-std-workspace-core' } +[dev-dependencies] +criterion = "0.6" + [features] rustc-dep-of-std = ["dep:std", "dep:core"] + +[[bench]] +name = "benches" +harness = false \ No newline at end of file diff --git a/benches/benches.rs b/benches/benches.rs index ecaef3e..9d2da71 100644 --- a/benches/benches.rs +++ b/benches/benches.rs @@ -1,16 +1,17 @@ -#![feature(test)] +#![feature(macro_metavar_expr_concat)] -extern crate test; - -use rustc_literal_escaper::*; +use std::hint::black_box; use std::ops::Range; use std::{array, iter}; +use criterion::{criterion_group, criterion_main, Criterion}; + +use rustc_literal_escaper::*; + const LEN: usize = 10_000; -#[bench] -fn bench_skip_ascii_whitespace(b: &mut test::Bencher) { - let input: String = test::black_box({ +fn bench_skip_ascii_whitespace(c: &mut Criterion) { + let input: String = black_box({ let mut res = "\\\n".to_string(); (0..LEN - 1).for_each(|_| res.push(' ')); res.push('\n'); @@ -18,30 +19,34 @@ fn bench_skip_ascii_whitespace(b: &mut test::Bencher) { }); assert_eq!(input[2..].len(), LEN); assert!(input.contains('\n')); - b.iter(|| { - let mut output = vec![]; - // This is internal, so call indirectly - // skip_ascii_whitespace(&mut input.chars(), 0, &mut |range, res| { - // output.push((range, res)) - // }); - unescape_str(&input, |range, res| output.push((range, res))); - assert_eq!( - output, - [((0..LEN + 2), Err(EscapeError::MultipleSkippedLinesWarning))] - ); + c.bench_function("skip_ascii_whitespace", |b| { + b.iter(|| { + let mut output = vec![]; + // This is internal, so call indirectly + // skip_ascii_whitespace(&mut input.chars(), 0, &mut |range, res| { + // output.push((range, res)) + // }); + unescape_str(&input, |range, res| output.push((range, res))); + assert_eq!( + output, + [((0..LEN + 2), Err(EscapeError::MultipleSkippedLinesWarning))] + ); + }) }); } +criterion_group!(skip_ascii_whitespace, bench_skip_ascii_whitespace,); + // // Check raw // macro_rules! fn_bench_check_raw { - ($name:ident, $unit:ty, $check_raw:ident) => { - fn $name(b: &mut test::Bencher, s: &str, expected: &[$unit]) { - let input: String = test::black_box([s; LEN].join("")); + ($check_raw:ident, $unit:ty) => { + fn ${concat("bench_", $check_raw)}(id: &str, c: &mut Criterion, s: &str, expected: &[$unit]) { + let input: String = black_box([s; LEN].join("")); assert_eq!(input.len(), LEN * s.len()); - b.iter(|| { + c.bench_function(&format!("{}: {id}", stringify!($check_raw)), |b| b.iter(|| { let mut output = Vec::with_capacity(expected.len()); $check_raw(&input, |range, res| output.push((range, res))); @@ -51,31 +56,29 @@ macro_rules! fn_bench_check_raw { for ((i, &e), (p, c)) in expected.iter().enumerate().zip(s.char_indices()) { assert_eq!(output[i], ((p..p + c.len_utf8()), Ok(e))); } - }); + })); } }; } -fn_bench_check_raw!(bench_check_raw_str, char, check_raw_str); -fn_bench_check_raw!(bench_check_raw_byte_str, u8, check_raw_byte_str); -fn_bench_check_raw!(bench_check_raw_c_str, char, check_raw_c_str); +fn_bench_check_raw!(check_raw_str, char); +fn_bench_check_raw!(check_raw_byte_str, u8); +fn_bench_check_raw!(check_raw_c_str, char); // raw str -#[bench] -fn bench_check_raw_str_ascii(b: &mut test::Bencher) { - bench_check_raw_str(b, "a", &['a'; LEN]); +fn bench_check_raw_str_ascii(c: &mut Criterion) { + bench_check_raw_str("ascii", c, "a", &['a'; LEN]); } -#[bench] -fn bench_check_raw_str_non_ascii(b: &mut test::Bencher) { - bench_check_raw_str(b, "🦀", &['🦀'; LEN]); +fn bench_check_raw_str_non_ascii(c: &mut Criterion) { + bench_check_raw_str("non-ascii", c, "🦀", &['🦀'; LEN]); } -#[bench] -fn bench_check_raw_str_unicode(b: &mut test::Bencher) { +fn bench_check_raw_str_unicode(c: &mut Criterion) { bench_check_raw_str( - b, + "unicode", + c, "a🦀🚀z", &array::from_fn::<_, { 4 * LEN }, _>(|i| match i % 4 { 0 => 'a', @@ -87,29 +90,35 @@ fn bench_check_raw_str_unicode(b: &mut test::Bencher) { ); } +criterion_group!( + raw_str, + bench_check_raw_str_ascii, + bench_check_raw_str_non_ascii, + bench_check_raw_str_unicode +); + // raw byte str -#[bench] -fn bench_check_raw_byte_str_ascii(b: &mut test::Bencher) { - bench_check_raw_byte_str(b, "a", &[b'a'; LEN]); +fn bench_check_raw_byte_str_ascii(c: &mut Criterion) { + bench_check_raw_byte_str("ascii", c, "a", &[b'a'; LEN]); } +criterion_group!(raw_byte_str, bench_check_raw_byte_str_ascii); + // raw C str -#[bench] -fn bench_check_raw_c_str_ascii(b: &mut test::Bencher) { - bench_check_raw_c_str(b, "a", &['a'; LEN]); +fn bench_check_raw_c_str_ascii(c: &mut Criterion) { + bench_check_raw_c_str("ascii", c, "a", &['a'; LEN]); } -#[bench] -fn bench_check_raw_c_str_non_ascii(b: &mut test::Bencher) { - bench_check_raw_c_str(b, "🦀", &['🦀'; LEN]); +fn bench_check_raw_c_str_non_ascii(c: &mut Criterion) { + bench_check_raw_c_str("non-ascii", c, "🦀", &['🦀'; LEN]); } -#[bench] -fn bench_check_raw_c_str_unicode(b: &mut test::Bencher) { +fn bench_check_raw_c_str_unicode(c: &mut Criterion) { bench_check_raw_c_str( - b, + "unicode", + c, "a🦀🚀z", &array::from_fn::<_, { 4 * LEN }, _>(|i| match i % 4 { 0 => 'a', @@ -121,19 +130,27 @@ fn bench_check_raw_c_str_unicode(b: &mut test::Bencher) { ); } +criterion_group!( + raw_c_str, + bench_check_raw_c_str_ascii, + bench_check_raw_c_str_non_ascii, + bench_check_raw_c_str_unicode +); + // // Unescape // macro_rules! fn_bench_unescape { - ($name:ident, $unit:ty, $unescape:ident) => { - fn $name( - b: &mut test::Bencher, + ($unescape:ident, $unit:ty) => { + fn ${concat("bench_", $unescape)}( + id: &str, + c: &mut Criterion, s: &str, expected: &[(Range, Result<$unit, EscapeError>)], ) { - let input: String = test::black_box([s; LEN].join("")); - b.iter(|| { + let input: String = black_box([s; LEN].join("")); + c.bench_function(&format!("{}: {id}", stringify!($unescape)), |b| b.iter(|| { let mut output = Vec::with_capacity(expected.len()); $unescape(&input, |range, res| output.push((range, res))); @@ -143,41 +160,41 @@ macro_rules! fn_bench_unescape { for (i, e) in expected.iter().enumerate() { assert_eq!(output[i], *e); } - }); + })); } }; } -fn_bench_unescape!(bench_unescape_str, char, unescape_str); -fn_bench_unescape!(bench_unescape_byte_str, u8, unescape_byte_str); -fn_bench_unescape!(bench_unescape_c_str, MixedUnit, unescape_c_str); +fn_bench_unescape!(unescape_str, char); +fn_bench_unescape!(unescape_byte_str, u8); +fn_bench_unescape!(unescape_c_str, MixedUnit); // str -#[bench] -fn bench_unescape_str_ascii(b: &mut test::Bencher) { +fn bench_unescape_str_ascii(c: &mut Criterion) { bench_unescape_str( - b, + "ascii", + c, r"a", &array::from_fn::<_, LEN, _>(|i| (i..i + 1, Ok('a'))), ); } -#[bench] -fn bench_unescape_str_non_ascii(b: &mut test::Bencher) { +fn bench_unescape_str_non_ascii(c: &mut Criterion) { bench_unescape_str( - b, + "non-ascii", + c, r"🦀", &array::from_fn::<_, LEN, _>(|i| (4 * i..4 * (i + 1), Ok('🦀'))), ); } -#[bench] -fn bench_unescape_str_unicode(b: &mut test::Bencher) { +fn bench_unescape_str_unicode(c: &mut Criterion) { let input = "a🦀🚀z"; let l = input.len(); bench_unescape_str( - b, + "unicode", + c, input, &array::from_fn::<_, { 4 * LEN }, _>(|i| match i % 4 { 0 => (i / 4 * l..i / 4 * l + 1, Ok('a')), @@ -189,30 +206,37 @@ fn bench_unescape_str_unicode(b: &mut test::Bencher) { ); } -#[bench] -fn bench_unescape_str_ascii_escape(b: &mut test::Bencher) { +criterion_group!( + str_no_escape, + bench_unescape_str_ascii, + bench_unescape_str_non_ascii, + bench_unescape_str_unicode +); + +fn bench_unescape_str_ascii_escape(c: &mut Criterion) { bench_unescape_str( - b, + "ascii", + c, r"\n", &array::from_fn::<_, LEN, _>(|i| (2 * i..2 * (i + 1), Ok('\n'))), ); } -#[bench] -fn bench_unescape_str_hex_escape(b: &mut test::Bencher) { +fn bench_unescape_str_hex_escape(c: &mut Criterion) { bench_unescape_str( - b, + "hex escape", + c, r"\x22", &array::from_fn::<_, LEN, _>(|i| (4 * i..4 * (i + 1), Ok('"'))), ); } -#[bench] -fn bench_unescape_str_unicode_escape(b: &mut test::Bencher) { +fn bench_unescape_str_unicode_escape(c: &mut Criterion) { let input = r"\u{1f980}\u{1f680}"; let l = input.len(); bench_unescape_str( - b, + "unicode escape", + c, input, &array::from_fn::<_, LEN, _>(|i| { if i % 2 == 0 { @@ -224,14 +248,14 @@ fn bench_unescape_str_unicode_escape(b: &mut test::Bencher) { ); } -#[bench] -fn bench_unescape_str_mixed_escape(b: &mut test::Bencher) { +fn bench_unescape_str_mixed_escape(c: &mut Criterion) { let inputs = [r"\n", r"\x22", r"\u{1f980}", r"\u{1f680}"]; let n = inputs.len(); let input = inputs.join(""); let l = input.len(); bench_unescape_str( - b, + "mixed escape", + c, &input, &iter::from_fn({ let mut i = 0; @@ -253,43 +277,53 @@ fn bench_unescape_str_mixed_escape(b: &mut test::Bencher) { ); } +criterion_group!( + str_escape, + bench_unescape_str_ascii_escape, + bench_unescape_str_hex_escape, + bench_unescape_str_unicode_escape, + bench_unescape_str_mixed_escape +); + // byte str -#[bench] -fn bench_unescape_byte_str_ascii(b: &mut test::Bencher) { +fn bench_unescape_byte_str_ascii(c: &mut Criterion) { bench_unescape_byte_str( - b, + "ascii", + c, r"a", &array::from_fn::<_, { LEN }, _>(|i| (i..i + 1, Ok(b'a'))), ); } -#[bench] -fn bench_unescape_byte_str_ascii_escape(b: &mut test::Bencher) { +criterion_group!(byte_str_no_escape, bench_unescape_byte_str_ascii); + +fn bench_unescape_byte_str_ascii_escape(c: &mut Criterion) { bench_unescape_byte_str( - b, + "ascii escape", + c, r"\n", &array::from_fn::<_, { LEN }, _>(|i| (2 * i..2 * (i + 1), Ok(b'\n'))), ); } -#[bench] -fn bench_unescape_byte_str_hex_escape(b: &mut test::Bencher) { +fn bench_unescape_byte_str_hex_escape(c: &mut Criterion) { bench_unescape_byte_str( - b, + "hex escape", + c, r"\xff", &array::from_fn::<_, { LEN }, _>(|i| (4 * i..4 * (i + 1), Ok(b'\xff'))), ); } -#[bench] -fn bench_unescape_byte_str_mixed_escape(b: &mut test::Bencher) { +fn bench_unescape_byte_str_mixed_escape(c: &mut Criterion) { let inputs = [r"a", r"\n", r"\xff", r"z"]; let input = inputs.join(""); let n = inputs.len(); let l = input.len(); bench_unescape_byte_str( - b, + "mixed escape", + c, &input, &iter::from_fn({ let mut i = 0; @@ -311,32 +345,39 @@ fn bench_unescape_byte_str_mixed_escape(b: &mut test::Bencher) { ); } +criterion_group!( + byte_str_escape, + bench_unescape_byte_str_ascii_escape, + bench_unescape_byte_str_hex_escape, + bench_unescape_byte_str_mixed_escape +); + // C str -#[bench] -fn bench_unescape_c_str_ascii(b: &mut test::Bencher) { +fn bench_unescape_c_str_ascii(c: &mut Criterion) { bench_unescape_c_str( - b, + "ascii", + c, r"a", &array::from_fn::<_, { LEN }, _>(|i| (i..i + 1, Ok(MixedUnit::Char('a')))), ); } -#[bench] -fn bench_unescape_c_str_non_ascii(b: &mut test::Bencher) { +fn bench_unescape_c_str_non_ascii(c: &mut Criterion) { bench_unescape_c_str( - b, + "non-ascii", + c, r"🦀", &array::from_fn::<_, LEN, _>(|i| (4 * i..4 * (i + 1), Ok(MixedUnit::Char('🦀')))), ); } -#[bench] -fn bench_unescape_c_str_unicode(b: &mut test::Bencher) { +fn bench_unescape_c_str_unicode(c: &mut Criterion) { let input = "a🦀🚀z"; let l = input.len(); bench_unescape_c_str( - b, + "unicode", + c, input, &array::from_fn::<_, { 4 * LEN }, _>(|i| match i % 4 { 0 => (i / 4 * l..i / 4 * l + 1, Ok(MixedUnit::Char('a'))), @@ -348,28 +389,35 @@ fn bench_unescape_c_str_unicode(b: &mut test::Bencher) { ); } -#[bench] -fn bench_unescape_c_str_ascii_escape(b: &mut test::Bencher) { +criterion_group!( + c_str_no_escape, + bench_unescape_c_str_ascii, + bench_unescape_c_str_non_ascii, + bench_unescape_c_str_unicode +); + +fn bench_unescape_c_str_ascii_escape(c: &mut Criterion) { bench_unescape_c_str( - b, + "ascii escape", + c, r"\n", &array::from_fn::<_, { LEN }, _>(|i| (2 * i..2 * (i + 1), Ok(MixedUnit::Char('\n')))), ); } -#[bench] -fn bench_unescape_c_str_hex_escape_ascii(b: &mut test::Bencher) { +fn bench_unescape_c_str_hex_escape_ascii(c: &mut Criterion) { bench_unescape_c_str( - b, + "hex escape (ascii)", + c, r"\x22", &array::from_fn::<_, { LEN }, _>(|i| (4 * i..4 * (i + 1), Ok(MixedUnit::Char('"')))), ); } -#[bench] -fn bench_unescape_c_str_hex_escape_byte(b: &mut test::Bencher) { +fn bench_unescape_c_str_hex_escape_byte(c: &mut Criterion) { bench_unescape_c_str( - b, + "hex escape (byte)", + c, r"\xff", &array::from_fn::<_, { LEN }, _>(|i| { (4 * i..4 * (i + 1), Ok(MixedUnit::HighByte(b'\xff'))) @@ -377,23 +425,23 @@ fn bench_unescape_c_str_hex_escape_byte(b: &mut test::Bencher) { ); } -#[bench] -fn bench_unescape_c_str_unicode_escape(b: &mut test::Bencher) { +fn bench_unescape_c_str_unicode_escape(c: &mut Criterion) { bench_unescape_c_str( - b, + "unicode escape", + c, r"\u{1f980}", &array::from_fn::<_, { LEN }, _>(|i| (9 * i..9 * (i + 1), Ok(MixedUnit::Char('🦀')))), ); } -#[bench] -fn bench_unescape_c_str_mixed_escape(b: &mut test::Bencher) { +fn bench_unescape_c_str_mixed_escape(c: &mut Criterion) { let inputs = [r"\n", r"\x22", r"\u{1f980}", r"\u{1f680}", r"\xff"]; let n = inputs.len(); let input = inputs.join(""); let l = input.len(); bench_unescape_c_str( - b, + "mixed escape", + c, &input, &iter::from_fn({ let mut i = 0; @@ -418,3 +466,25 @@ fn bench_unescape_c_str_mixed_escape(b: &mut test::Bencher) { .collect::>(), ); } + +criterion_group!( + c_str_escape, + bench_unescape_c_str_ascii_escape, + bench_unescape_c_str_hex_escape_ascii, + bench_unescape_c_str_hex_escape_byte, + bench_unescape_c_str_unicode_escape, + bench_unescape_c_str_mixed_escape +); + +criterion_main!( + skip_ascii_whitespace, + raw_str, + raw_byte_str, + raw_c_str, + str_no_escape, + str_escape, + byte_str_no_escape, + byte_str_escape, + c_str_no_escape, + c_str_escape, +);