From c615a0fb20f5e613e39e409851fde651b2868094 Mon Sep 17 00:00:00 2001 From: Mahdi Ali-Raihan Date: Sat, 8 Nov 2025 13:40:48 -0500 Subject: [PATCH] Merge pull request #9182 from asder8215/factor_benchmarking Factor: base benchmarking for single/multiple u64, u128, and >u128 --- .github/workflows/benchmarks.yml | 1 + Cargo.lock | 1 + src/uu/factor/Cargo.toml | 8 ++++ src/uu/factor/benches/factor_bench.rs | 56 +++++++++++++++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 src/uu/factor/benches/factor_bench.rs diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index 7485555e0..e1c042e23 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -43,6 +43,7 @@ jobs: - { package: uu_unexpand } - { package: uu_uniq } - { package: uu_wc } + - { package: uu_factor } steps: - uses: actions/checkout@v5 with: diff --git a/Cargo.lock b/Cargo.lock index 6a9aee9db..43254abaa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3448,6 +3448,7 @@ name = "uu_factor" version = "0.3.0" dependencies = [ "clap", + "codspeed-divan-compat", "fluent", "num-bigint", "num-prime", diff --git a/src/uu/factor/Cargo.toml b/src/uu/factor/Cargo.toml index 16b56a6ec..15d09f7a0 100644 --- a/src/uu/factor/Cargo.toml +++ b/src/uu/factor/Cargo.toml @@ -29,5 +29,13 @@ fluent = { workspace = true } name = "factor" path = "src/main.rs" +[dev-dependencies] +divan = { workspace = true } +uucore = { workspace = true, features = ["benchmark"] } + [lib] path = "src/factor.rs" + +[[bench]] +name = "factor_bench" +harness = false diff --git a/src/uu/factor/benches/factor_bench.rs b/src/uu/factor/benches/factor_bench.rs new file mode 100644 index 000000000..121865ac0 --- /dev/null +++ b/src/uu/factor/benches/factor_bench.rs @@ -0,0 +1,56 @@ +// This file is part of the uutils coreutils package. +// +// For the full copyright and license information, please view the LICENSE +// file that was distributed with this source code. + +use divan::{Bencher, black_box}; +use uu_factor::uumain; +use uucore::benchmark::run_util_function; + +/// Benchmark multiple u64 digits +#[divan::bench(args = [(2)])] +fn factor_multiple_u64s(bencher: Bencher, start_num: u64) { + bencher + // this is a range of 5000 different u128 integers + .with_inputs(|| (start_num, start_num + 2500)) + .bench_values(|(start_u64, end_u64)| { + for u64_digit in start_u64..=end_u64 { + black_box(run_util_function(uumain, &[&u64_digit.to_string()])); + } + }); +} + +/// Benchmark multiple u128 digits +#[divan::bench(args = [(18446744073709551616)])] +fn factor_multiple_u128s(bencher: Bencher, start_num: u128) { + bencher + .with_inputs(|| { + // this is a range of 1000 different u128 integers + (start_num, start_num + 1000) + }) + .bench_values(|(start_u128, end_u128)| { + for u128_digit in start_u128..=end_u128 { + black_box(run_util_function(uumain, &[&u128_digit.to_string()])); + } + }); +} + +/// Benchmark multiple > u128::MAX digits +#[divan::bench] +fn factor_multiple_big_uint(bencher: Bencher) { + // max u128 value is 340_282_366_920_938_463_463_374_607_431_768_211_455 + bencher + // this is a range of 3 different BigUints. The range is small due to + // some BigUints being unable to be factorized into prime numbers properly + .with_inputs(|| (768_211_459_u64, 768_211_461_u64)) + .bench_values(|(start_big_uint, end_big_uint)| { + for digit in start_big_uint..=end_big_uint { + let big_uint_str = format!("340282366920938463463374607431768211456{digit}"); + black_box(run_util_function(uumain, &[&big_uint_str])); + } + }); +} + +fn main() { + divan::main(); +}