From 96ac798647607378e14fb57a1160e9418941ac25 Mon Sep 17 00:00:00 2001 From: mo8it Date: Wed, 31 Jan 2024 09:15:52 +0100 Subject: [PATCH 1/8] Rust related Git ignores Signed-off-by: mo8it --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) 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 From 0dac1b1b60df12744afc4848e847f5f58b4441bd Mon Sep 17 00:00:00 2001 From: mo8it Date: Wed, 31 Jan 2024 09:16:16 +0100 Subject: [PATCH 2/8] Format Signed-off-by: mo8it --- .../comparison/sort-random-rust/src/main.rs | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) 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..d7e31273e49c 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 @@ -2,24 +2,32 @@ // cd sort-random-rust // cargo build --release // target/release/sort-random-rust -use rand::prelude::*; use rand::distributions::Standard; +use rand::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 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(); 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 + ); } From a2cfbb3898c68cda55e9f0c40ac150feede703d0 Mon Sep 17 00:00:00 2001 From: mo8it Date: Wed, 31 Jan 2024 09:17:24 +0100 Subject: [PATCH 3/8] Optimize the release binary Signed-off-by: mo8it --- .../comparison/sort-random-rust/.cargo/config.toml | 5 +++++ .../performance/comparison/sort-random-rust/Cargo.toml | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 test/library/packages/Sort/performance/comparison/sort-random-rust/.cargo/config.toml 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..1ea068112ba6 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 @@ -3,8 +3,11 @@ name = "sort-random-rust" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] rand = "0.8.4" +[profile.release] +lto = true +codegen-units = 1 +strip = true +panic = "abort" From a6523d95ee30b1145acb588a07018ef30818be1c Mon Sep 17 00:00:00 2001 From: mo8it Date: Wed, 31 Jan 2024 09:18:07 +0100 Subject: [PATCH 4/8] cargo run is enough Signed-off-by: mo8it --- .../Sort/performance/comparison/sort-random-rust/src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 d7e31273e49c..f687f431090d 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,7 +1,7 @@ // run it with // cd sort-random-rust -// cargo build --release -// target/release/sort-random-rust +// cargo run --release + use rand::distributions::Standard; use rand::prelude::*; use std::time::Instant; From f290276204b4f19662309c5ec177717880bba4d7 Mon Sep 17 00:00:00 2001 From: mo8it Date: Wed, 31 Jan 2024 09:34:22 +0100 Subject: [PATCH 5/8] Use SmallRng with rayon for the generation of random numbers Signed-off-by: mo8it --- .../comparison/sort-random-rust/Cargo.toml | 3 ++- .../comparison/sort-random-rust/src/main.rs | 11 ++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) 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 1ea068112ba6..dd218c02a111 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 @@ -4,7 +4,8 @@ version = "0.1.0" edition = "2021" [dependencies] -rand = "0.8.4" +rand = { version = "0.8.4", features = ["small_rng"] } +rayon = "1.8.1" [profile.release] lto = true 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 f687f431090d..56f7ae4b3554 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 @@ -2,15 +2,20 @@ // cd sort-random-rust // cargo run --release -use rand::distributions::Standard; -use rand::prelude::*; +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 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", From b4381d1787d6abc489b183240324203038676898 Mon Sep 17 00:00:00 2001 From: mo8it Date: Wed, 31 Jan 2024 09:52:30 +0100 Subject: [PATCH 6/8] No need for Debug formatting Signed-off-by: mo8it --- .../performance/comparison/sort-random-rust/src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 56f7ae4b3554..72a95c8d96e9 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 @@ -18,7 +18,7 @@ fn main() { .collect_into_vec(&mut values); let gen_duration = t1.elapsed(); println!( - "generating {:?} MiB/s", + "generating {} MiB/s", 8.0 * (n as f64) / gen_duration.as_secs_f64() / 1024.0 / 1024.0 ); @@ -27,12 +27,12 @@ fn main() { let duration = start.elapsed(); println!( - "{:?} MiB/s", + "{} MiB/s", 8.0 * (n as f64) / duration.as_secs_f64() / 1024.0 / 1024.0 ); println!( - "{:?} million elements sorted per second", + "{} million elements sorted per second", (n as f64) / duration.as_secs_f64() / 1000.0 / 1000.0 ); } From c2776bcaa58eebf6a4cb87beeda74d2bcc15c375 Mon Sep 17 00:00:00 2001 From: mo8it Date: Wed, 31 Jan 2024 10:09:59 +0100 Subject: [PATCH 7/8] Use rayon for sorting Signed-off-by: mo8it --- .../performance/comparison/sort-random-rust/src/main.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 72a95c8d96e9..08fabbcf0de0 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 @@ -7,6 +7,12 @@ use rayon::prelude::*; use std::time::Instant; fn main() { + // 4 threads performed the best on my 8 core machine. + rayon::ThreadPoolBuilder::new() + .num_threads(4) + .build_global() + .unwrap(); + let n = 128 * 1024 * 1024; let t1 = Instant::now(); @@ -23,7 +29,7 @@ fn main() { ); let start = Instant::now(); - values.sort_unstable(); + values.par_sort_unstable(); let duration = start.elapsed(); println!( From 26e000f3bf51f99e8273be2ebf863ebf921ede58 Mon Sep 17 00:00:00 2001 From: mo8it Date: Mon, 5 Feb 2024 15:24:26 +0100 Subject: [PATCH 8/8] Use rayon sorting in a separate project Signed-off-by: mo8it --- .../sort-random-rust-rayon/.cargo/config.toml | 5 +++ .../sort-random-rust-rayon/Cargo.toml | 15 ++++++++ .../sort-random-rust-rayon/src/main.rs | 38 +++++++++++++++++++ .../comparison/sort-random-rust/Cargo.toml | 3 +- .../comparison/sort-random-rust/src/main.rs | 9 +---- 5 files changed, 62 insertions(+), 8 deletions(-) create mode 100644 test/library/packages/Sort/performance/comparison/sort-random-rust-rayon/.cargo/config.toml create mode 100644 test/library/packages/Sort/performance/comparison/sort-random-rust-rayon/Cargo.toml create mode 100644 test/library/packages/Sort/performance/comparison/sort-random-rust-rayon/src/main.rs 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.toml b/test/library/packages/Sort/performance/comparison/sort-random-rust/Cargo.toml index dd218c02a111..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,7 +1,8 @@ [package] name = "sort-random-rust" -version = "0.1.0" +version = "0.0.0" edition = "2021" +publish = false [dependencies] rand = { version = "0.8.4", features = ["small_rng"] } 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 08fabbcf0de0..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 @@ -7,12 +7,6 @@ use rayon::prelude::*; use std::time::Instant; fn main() { - // 4 threads performed the best on my 8 core machine. - rayon::ThreadPoolBuilder::new() - .num_threads(4) - .build_global() - .unwrap(); - let n = 128 * 1024 * 1024; let t1 = Instant::now(); @@ -29,7 +23,8 @@ fn main() { ); let start = Instant::now(); - values.par_sort_unstable(); + // Without rayon. + values.sort_unstable(); let duration = start.elapsed(); println!(