diff --git a/.gitignore b/.gitignore index f0925b0b5a22..6e675bab1644 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,8 @@ tags .idea/ cmake-build-*/ .cache/ +target/ +Cargo.lock # Top level ignores. /BUILD_VERSION diff --git a/test/library/packages/Sort/performance/comparison/sort-random-rust-rayon/.cargo/config.toml b/test/library/packages/Sort/performance/comparison/sort-random-rust-rayon/.cargo/config.toml new file mode 100644 index 000000000000..7ca303ca1343 --- /dev/null +++ b/test/library/packages/Sort/performance/comparison/sort-random-rust-rayon/.cargo/config.toml @@ -0,0 +1,5 @@ +[build] +rustflags = [ + "-C", + "target-cpu=native", +] diff --git a/test/library/packages/Sort/performance/comparison/sort-random-rust-rayon/Cargo.toml b/test/library/packages/Sort/performance/comparison/sort-random-rust-rayon/Cargo.toml new file mode 100644 index 000000000000..8324cc818360 --- /dev/null +++ b/test/library/packages/Sort/performance/comparison/sort-random-rust-rayon/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "sort-random-rust-rayon" +version = "0.0.0" +edition = "2021" +publish = false + +[dependencies] +rand = { version = "0.8.4", features = ["small_rng"] } +rayon = "1.8.1" + +[profile.release] +lto = true +codegen-units = 1 +strip = true +panic = "abort" diff --git a/test/library/packages/Sort/performance/comparison/sort-random-rust-rayon/src/main.rs b/test/library/packages/Sort/performance/comparison/sort-random-rust-rayon/src/main.rs new file mode 100644 index 000000000000..d6b04f5a2f04 --- /dev/null +++ b/test/library/packages/Sort/performance/comparison/sort-random-rust-rayon/src/main.rs @@ -0,0 +1,38 @@ +// run it with +// cd sort-random-rust +// cargo run --release + +use rand::{distributions::Standard, rngs::SmallRng, Rng, SeedableRng}; +use rayon::prelude::*; +use std::time::Instant; + +fn main() { + let n = 128 * 1024 * 1024; + + let t1 = Instant::now(); + let rng = SmallRng::seed_from_u64(42); + let mut values = Vec::::new(); + (0..n) + .into_par_iter() + .map_with(rng, |rng, _| rng.sample(Standard)) + .collect_into_vec(&mut values); + let gen_duration = t1.elapsed(); + println!( + "generating {} MiB/s", + 8.0 * (n as f64) / gen_duration.as_secs_f64() / 1024.0 / 1024.0 + ); + + let start = Instant::now(); + values.par_sort_unstable(); + let duration = start.elapsed(); + + println!( + "{} MiB/s", + 8.0 * (n as f64) / duration.as_secs_f64() / 1024.0 / 1024.0 + ); + + println!( + "{} million elements sorted per second", + (n as f64) / duration.as_secs_f64() / 1000.0 / 1000.0 + ); +} diff --git a/test/library/packages/Sort/performance/comparison/sort-random-rust/.cargo/config.toml b/test/library/packages/Sort/performance/comparison/sort-random-rust/.cargo/config.toml new file mode 100644 index 000000000000..7ca303ca1343 --- /dev/null +++ b/test/library/packages/Sort/performance/comparison/sort-random-rust/.cargo/config.toml @@ -0,0 +1,5 @@ +[build] +rustflags = [ + "-C", + "target-cpu=native", +] diff --git a/test/library/packages/Sort/performance/comparison/sort-random-rust/Cargo.toml b/test/library/packages/Sort/performance/comparison/sort-random-rust/Cargo.toml index 24e280ba91d4..1d9c169a261f 100644 --- a/test/library/packages/Sort/performance/comparison/sort-random-rust/Cargo.toml +++ b/test/library/packages/Sort/performance/comparison/sort-random-rust/Cargo.toml @@ -1,10 +1,15 @@ [package] name = "sort-random-rust" -version = "0.1.0" +version = "0.0.0" edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +publish = false [dependencies] -rand = "0.8.4" +rand = { version = "0.8.4", features = ["small_rng"] } +rayon = "1.8.1" +[profile.release] +lto = true +codegen-units = 1 +strip = true +panic = "abort" diff --git a/test/library/packages/Sort/performance/comparison/sort-random-rust/src/main.rs b/test/library/packages/Sort/performance/comparison/sort-random-rust/src/main.rs index 1352c3ee830d..8254003c6d64 100644 --- a/test/library/packages/Sort/performance/comparison/sort-random-rust/src/main.rs +++ b/test/library/packages/Sort/performance/comparison/sort-random-rust/src/main.rs @@ -1,25 +1,39 @@ // run it with // cd sort-random-rust -// cargo build --release -// target/release/sort-random-rust -use rand::prelude::*; -use rand::distributions::Standard; +// cargo run --release + +use rand::{distributions::Standard, rngs::SmallRng, Rng, SeedableRng}; +use rayon::prelude::*; use std::time::Instant; fn main() { - let n = 128*1024*1024; + let n = 128 * 1024 * 1024; let t1 = Instant::now(); - let mut values: Vec = rand::thread_rng().sample_iter(Standard).take(n).collect(); + let rng = SmallRng::seed_from_u64(42); + let mut values = Vec::::new(); + (0..n) + .into_par_iter() + .map_with(rng, |rng, _| rng.sample(Standard)) + .collect_into_vec(&mut values); let gen_duration = t1.elapsed(); - println!("generating {:?} MiB/s", 8.0*(n as f64)/gen_duration.as_secs_f64()/1024.0/1024.0); + println!( + "generating {} MiB/s", + 8.0 * (n as f64) / gen_duration.as_secs_f64() / 1024.0 / 1024.0 + ); let start = Instant::now(); + // Without rayon. values.sort_unstable(); let duration = start.elapsed(); - println!("{:?} MiB/s", 8.0*(n as f64)/duration.as_secs_f64()/1024.0/1024.0); + println!( + "{} MiB/s", + 8.0 * (n as f64) / duration.as_secs_f64() / 1024.0 / 1024.0 + ); - println!("{:?} million elements sorted per second", - (n as f64)/duration.as_secs_f64()/1000.0/1000.0); + println!( + "{} million elements sorted per second", + (n as f64) / duration.as_secs_f64() / 1000.0 / 1000.0 + ); }