From 019970b2aa4c713182d985546206e0c97895442b Mon Sep 17 00:00:00 2001 From: JestDotty <jestdottydev@gmail.com> Date: Sun, 23 Mar 2025 22:29:54 -0400 Subject: [PATCH] optimization benchmarks. switched to tokio --- jest_rust/Cargo.lock | 330 ++++++++++++++++++++++++++++++++++++++---- jest_rust/Cargo.toml | 7 +- jest_rust/README.md | 48 +++++- jest_rust/src/main.rs | 47 ++++-- 4 files changed, 389 insertions(+), 43 deletions(-) diff --git a/jest_rust/Cargo.lock b/jest_rust/Cargo.lock index e8971c0..0a656cd 100644 --- a/jest_rust/Cargo.lock +++ b/jest_rust/Cargo.lock @@ -3,59 +3,337 @@ version = 4 [[package]] -name = "crossbeam-deque" -version = "0.8.6" +name = "addr2line" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", + "gimli", ] [[package]] -name = "crossbeam-epoch" -version = "0.9.18" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ - "crossbeam-utils", + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", ] [[package]] -name = "crossbeam-utils" -version = "0.8.21" +name = "bitflags" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] -name = "either" -version = "1.15.0" +name = "bytes" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "jisspam" version = "0.1.0" dependencies = [ - "rayon", + "tokio", ] [[package]] -name = "rayon" -version = "1.10.0" +name = "libc" +version = "0.2.171" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ - "either", - "rayon-core", + "autocfg", + "scopeguard", ] [[package]] -name = "rayon-core" -version = "1.12.1" +name = "memchr" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "miniz_oxide" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" dependencies = [ - "crossbeam-deque", - "crossbeam-utils", + "adler2", ] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi", + "windows-sys", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +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 = "redox_syscall" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "smallvec" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "syn" +version = "2.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tokio" +version = "1.44.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +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/jest_rust/Cargo.toml b/jest_rust/Cargo.toml index 6df2ee3..125db01 100644 --- a/jest_rust/Cargo.toml +++ b/jest_rust/Cargo.toml @@ -4,9 +4,10 @@ version = "0.1.0" edition = "2024" [dependencies] -rayon = "1.10.0" +tokio = { version = "1.44.1", features = ["full"] } [profile.release] -lto = "thin" # Full Link-Time Optimization for maximum runtime speed -debug = false # Disables debug symbols to streamline the binary +codegen-units = 1 # less means more compile work but better optimized +lto = "thin" # thin has best performance. fat the worst +strip = true panic = "abort" diff --git a/jest_rust/README.md b/jest_rust/README.md index 03feba5..d90b2bf 100644 --- a/jest_rust/README.md +++ b/jest_rust/README.md @@ -51,4 +51,50 @@ Time Retoor Python: 287.63036131858826 ***end benchmark*** ``` -add `/jisspam` to `.gitignore` to not commit the executable accidentally \ No newline at end of file +add `/jisspam` to `.gitignore` to not commit the executable accidentally + +# local machine benchmarks + +single threaded: +``` +***benchmarking*** +Time C: 2.4082751274108887 +Time Rust: 2.865687847137451 +Time CPP: 1.1568822860717773 +Time Borded CPP: 1.9657189846038818 +Time Jest Rust: 33.63373279571533 +Time Retoor Python: 133.92413425445557 +***end benchmark*** +``` + +rayon: +``` +***benchmarking*** +Time C: 2.457853317260742 +Time Rust: 3.0170154571533203 +Time CPP: 1.1482579708099365 +Time Borded CPP: 2.002591371536255 +Time Jest Rust: 4.294418811798096 +Time Retoor Python: 201.2997748851776 +***end benchmark*** +``` + +tokio: +``` +***benchmarking*** +Time C: 2.448648452758789 +Time Rust: 3.095592737197876 +Time CPP: 1.1662013530731201 +Time Borded CPP: 1.9207634925842285 +Time Jest Rust: 4.717588901519775 +Time Retoor Python: 139.8203284740448 +***end benchmark*** +``` +lto not thin: `Time Jest Rust: 5.306957483291626` slower +lto fat: `Time Jest Rust: 5.413678407669067` slower +codegen-units 1: `Time Jest Rust: 4.451631546020508` faster +opt-level z: `Time Jest Rust: 7.045313119888306` slower +strip true: `Time Jest Rust: 4.337219476699829` faster +lto true: `Time Jest Rust: 4.703521728515625` slower +lto none: `Time Jest Rust: 4.817203998565674` +lto thin: `Time Jest Rust: 4.429729223251343` faster \ No newline at end of file diff --git a/jest_rust/src/main.rs b/jest_rust/src/main.rs index ea6b81b..7482fd0 100644 --- a/jest_rust/src/main.rs +++ b/jest_rust/src/main.rs @@ -1,5 +1,5 @@ -use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; -use std::{env, fmt::Display, fs}; +use std::{env, fmt::Display, fs, ops::AddAssign}; +use tokio::sync::mpsc; static FORBIDDEN_WORDS: &'static [&'static str] = &[ "recovery", @@ -93,6 +93,19 @@ impl Stats { } } } +impl AddAssign for Stats { + fn add_assign(&mut self, rhs: Self) { + self.file_count += rhs.file_count; + self.failed_file_count += rhs.failed_file_count; + + self.sentence_count += rhs.sentence_count; + self.word_count += rhs.word_count; + + self.capitalized_count += rhs.capitalized_count; + self.numeric_count += rhs.numeric_count; + self.forbidden_count += rhs.forbidden_count; + } +} impl Display for Stats { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { writeln!(f, "file count: {}", self.file_count)?; @@ -124,18 +137,26 @@ impl Display for Stats { } } -fn main() { +#[tokio::main] +async fn main() { let files = env::args().skip(1); - // let mut stats = Stats::default(); - // for file in files { - // stats.process(&file); - // } - let files = files.collect::<Vec<_>>(); - files.par_iter().for_each(|file| { - let mut stats = Stats::default(); - stats.process(&file); - println!("{stats}"); - }); + let mut stats = Stats::default(); + let mut rx = { + let (tx, rx) = mpsc::unbounded_channel(); + for file in files { + let tx = tx.clone(); + tokio::spawn(async move { + let mut stats = Stats::default(); + stats.process(&file); + tx.send(stats).unwrap(); + }); + } + rx + }; + while let Some(file_stat) = rx.recv().await { + stats += file_stat; + } + println!("{stats}"); } #[test]