From bb036f83d584ff5fdfee9cb4e516fb36344255b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20K=C3=A4nner?= Date: Sun, 6 Jul 2025 21:36:11 +0200 Subject: [PATCH] use more efficient lazy static --- Cargo.lock | 108 +++++++++++++++++++++------- battlesnake/Cargo.toml | 1 + battlesnake/src/bin/seed-cracker.rs | 47 ++++++------ 3 files changed, 108 insertions(+), 48 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 135bce6..478f389 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -228,9 +228,16 @@ dependencies = [ "serde", "serde_json", "sqlx", + "static_init", "tokio", ] +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.9.1" @@ -260,7 +267,7 @@ checksum = "56791e4bd64c99fc361e01008f45c984baa93f12a0957d1b3c51dd2c6baab453" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -317,6 +324,18 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "ciborium" version = "0.2.2" @@ -375,7 +394,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -562,7 +581,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -606,7 +625,7 @@ checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -618,7 +637,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -693,7 +712,7 @@ checksum = "7693d9dd1ec1c54f52195dfe255b627f7cec7da33b679cd56de949e662b3db10" dependencies = [ "flame", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -792,7 +811,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -1209,7 +1228,7 @@ checksum = "6c6e1db7ed32c6c71b759497fae34bf7933636f75a251b9e736555da426f6442" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -1710,7 +1729,7 @@ version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ - "bitflags", + "bitflags 2.9.1", ] [[package]] @@ -1821,7 +1840,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -2009,7 +2028,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn", + "syn 2.0.101", ] [[package]] @@ -2032,7 +2051,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn", + "syn 2.0.101", "tokio", "url", ] @@ -2045,7 +2064,7 @@ checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" dependencies = [ "atoi", "base64", - "bitflags", + "bitflags 2.9.1", "byteorder", "bytes", "crc", @@ -2087,7 +2106,7 @@ checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" dependencies = [ "atoi", "base64", - "bitflags", + "bitflags 2.9.1", "byteorder", "crc", "dotenvy", @@ -2146,6 +2165,34 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_init" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bae1df58c5fea7502e8e352ec26b5579f6178e1fdb311e088580c980dee25ed" +dependencies = [ + "bitflags 1.3.2", + "cfg_aliases 0.2.1", + "libc", + "parking_lot", + "parking_lot_core", + "static_init_macro", + "winapi", +] + +[[package]] +name = "static_init_macro" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1389c88ddd739ec6d3f8f83343764a0e944cd23cfbf126a9796a714b0b6edd6f" +dependencies = [ + "cfg_aliases 0.1.1", + "memchr", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "stringprep" version = "0.1.5" @@ -2169,6 +2216,17 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.101" @@ -2194,7 +2252,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -2220,7 +2278,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -2295,7 +2353,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -2382,7 +2440,7 @@ checksum = "1b1ffbcf9c6f6b99d386e7444eb608ba646ae452a36b39737deb9663b610f662" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -2538,7 +2596,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn", + "syn 2.0.101", "wasm-bindgen-shared", ] @@ -2560,7 +2618,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2779,7 +2837,7 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags", + "bitflags 2.9.1", ] [[package]] @@ -2825,7 +2883,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", "synstructure", ] @@ -2846,7 +2904,7 @@ checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -2866,7 +2924,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", "synstructure", ] @@ -2906,5 +2964,5 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] diff --git a/battlesnake/Cargo.toml b/battlesnake/Cargo.toml index 5aa0af1..e200979 100644 --- a/battlesnake/Cargo.toml +++ b/battlesnake/Cargo.toml @@ -56,6 +56,7 @@ bytemuck = "1.23.1" flame = "0.2.2" flamer = "0.5.0" rayon = "1.10.0" +static_init = "1.0.4" [dev-dependencies] criterion = "0.5" diff --git a/battlesnake/src/bin/seed-cracker.rs b/battlesnake/src/bin/seed-cracker.rs index 4220db7..3b30aff 100644 --- a/battlesnake/src/bin/seed-cracker.rs +++ b/battlesnake/src/bin/seed-cracker.rs @@ -2,10 +2,7 @@ use std::{ cell::RefCell, fs::File, path::PathBuf, - sync::{ - LazyLock, - atomic::{AtomicU32, Ordering}, - }, + sync::atomic::{AtomicU32, Ordering}, time::Instant, }; @@ -18,6 +15,7 @@ use hashbrown::HashMap; use log::{debug, error, info, trace}; use memmap2::{Mmap, MmapOptions}; use rayon::iter::{IntoParallelIterator, ParallelIterator}; +use static_init::dynamic; type DynError = Box; @@ -438,7 +436,8 @@ fn prepare_initial_food(request: &Request) -> Box<[(u8, u8)]> { x: (request.board.width - 1) / 2, y: (request.board.height) / 2, }; - let initial_food = request + + request .board .snakes .iter() @@ -499,8 +498,7 @@ fn prepare_initial_food(request: &Request) -> Box<[(u8, u8)]> { .az(); (selected, possibilities) }) - .collect(); - initial_food + .collect() } fn prepare_starts(request: &Request) -> (bool, [Option; 4], [Option; 4]) { @@ -830,23 +828,26 @@ impl GoRand { } } -static CHAIN_RAW: LazyLock = LazyLock::new(|| unsafe { +#[dynamic] +static CHAIN_RAW: Mmap = unsafe { MmapOptions::new() .populate() .map(&File::open("assets/chain").unwrap()) .unwrap() -}); -static CHAIN: LazyLock<&[i32]> = LazyLock::new(|| cast_slice(&CHAIN_RAW)); -static TABLE_RAW: LazyLock = - LazyLock::new(|| unsafe { Mmap::map(&File::open("assets/table").unwrap()).unwrap() }); -static TABLE: LazyLock<&[u32]> = LazyLock::new(|| cast_slice(&TABLE_RAW)); +}; +#[dynamic] +static CHAIN: &'static [i32] = cast_slice(&CHAIN_RAW); +#[dynamic] +static TABLE_RAW: Mmap = unsafe { Mmap::map(&File::open("assets/table").unwrap()).unwrap() }; +#[dynamic] +static TABLE: &'static [u32] = cast_slice(&TABLE_RAW); #[derive(Debug, PartialEq, Eq, Clone)] struct GoSource { tap: u16, feed: u16, base_x_index: usize, - vec: HashMap, + state: HashMap, } impl GoSource { @@ -871,7 +872,7 @@ impl GoSource { tap: 0, feed: Self::LEN - Self::TAP, base_x_index, - vec: HashMap::new(), + state: HashMap::new(), } } } @@ -898,7 +899,7 @@ impl GoSource { self.tap = 0; self.feed = Self::LEN - Self::TAP; self.base_x_index = base_x_index; - self.vec.clear(); + self.state.clear(); } //#[flame] @@ -910,29 +911,29 @@ impl GoSource { let tap = self.tap; let feed = *self - .vec + .state .entry(feed) .or_insert_with(|| seed_one(self.base_x_index, feed)); let tap = *self - .vec + .state .entry(tap) .or_insert_with(|| seed_one(self.base_x_index, tap)); let x = feed.wrapping_add(tap); - self.vec.insert(self.feed, x); + self.state.insert(self.feed, x); x.wrapping_as() } } //#[flame] fn seed_one(base: usize, i: u16) -> i64 { + const LEN: usize = 0x7fff_fffe; let i = usize::from(i); let base = base + 20 + i * 3; - let len = CHAIN.len(); let (x1, x2, x3) = unsafe { - let x1 = *CHAIN.get_unchecked(base % len); - let x2 = *CHAIN.get_unchecked((base + 1) % len); - let x3 = *CHAIN.get_unchecked((base + 2) % len); + let x1 = *CHAIN.get_unchecked(base % LEN); + let x2 = seedrand(x1); + let x3 = seedrand(x2); (x1, x2, x3) }; let u = i64::from(x1) << 40;