use more efficient lazy static
All checks were successful
Build / build (push) Successful in 1m59s

This commit is contained in:
2025-07-06 21:36:11 +02:00
parent 7b28a4c4f6
commit bb036f83d5
3 changed files with 108 additions and 48 deletions

108
Cargo.lock generated
View File

@ -228,9 +228,16 @@ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
"sqlx", "sqlx",
"static_init",
"tokio", "tokio",
] ]
[[package]]
name = "bitflags"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "2.9.1" version = "2.9.1"
@ -260,7 +267,7 @@ checksum = "56791e4bd64c99fc361e01008f45c984baa93f12a0957d1b3c51dd2c6baab453"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
] ]
[[package]] [[package]]
@ -317,6 +324,18 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 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]] [[package]]
name = "ciborium" name = "ciborium"
version = "0.2.2" version = "0.2.2"
@ -375,7 +394,7 @@ dependencies = [
"heck", "heck",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
] ]
[[package]] [[package]]
@ -562,7 +581,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
] ]
[[package]] [[package]]
@ -606,7 +625,7 @@ checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
] ]
[[package]] [[package]]
@ -618,7 +637,7 @@ dependencies = [
"once_cell", "once_cell",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
] ]
[[package]] [[package]]
@ -693,7 +712,7 @@ checksum = "7693d9dd1ec1c54f52195dfe255b627f7cec7da33b679cd56de949e662b3db10"
dependencies = [ dependencies = [
"flame", "flame",
"quote", "quote",
"syn", "syn 2.0.101",
] ]
[[package]] [[package]]
@ -792,7 +811,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
] ]
[[package]] [[package]]
@ -1209,7 +1228,7 @@ checksum = "6c6e1db7ed32c6c71b759497fae34bf7933636f75a251b9e736555da426f6442"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
] ]
[[package]] [[package]]
@ -1710,7 +1729,7 @@ version = "0.5.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af"
dependencies = [ dependencies = [
"bitflags", "bitflags 2.9.1",
] ]
[[package]] [[package]]
@ -1821,7 +1840,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
] ]
[[package]] [[package]]
@ -2009,7 +2028,7 @@ dependencies = [
"quote", "quote",
"sqlx-core", "sqlx-core",
"sqlx-macros-core", "sqlx-macros-core",
"syn", "syn 2.0.101",
] ]
[[package]] [[package]]
@ -2032,7 +2051,7 @@ dependencies = [
"sqlx-mysql", "sqlx-mysql",
"sqlx-postgres", "sqlx-postgres",
"sqlx-sqlite", "sqlx-sqlite",
"syn", "syn 2.0.101",
"tokio", "tokio",
"url", "url",
] ]
@ -2045,7 +2064,7 @@ checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526"
dependencies = [ dependencies = [
"atoi", "atoi",
"base64", "base64",
"bitflags", "bitflags 2.9.1",
"byteorder", "byteorder",
"bytes", "bytes",
"crc", "crc",
@ -2087,7 +2106,7 @@ checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46"
dependencies = [ dependencies = [
"atoi", "atoi",
"base64", "base64",
"bitflags", "bitflags 2.9.1",
"byteorder", "byteorder",
"crc", "crc",
"dotenvy", "dotenvy",
@ -2146,6 +2165,34 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 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]] [[package]]
name = "stringprep" name = "stringprep"
version = "0.1.5" version = "0.1.5"
@ -2169,6 +2216,17 @@ version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 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]] [[package]]
name = "syn" name = "syn"
version = "2.0.101" version = "2.0.101"
@ -2194,7 +2252,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
] ]
[[package]] [[package]]
@ -2220,7 +2278,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
] ]
[[package]] [[package]]
@ -2295,7 +2353,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
] ]
[[package]] [[package]]
@ -2382,7 +2440,7 @@ checksum = "1b1ffbcf9c6f6b99d386e7444eb608ba646ae452a36b39737deb9663b610f662"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
] ]
[[package]] [[package]]
@ -2538,7 +2596,7 @@ dependencies = [
"log", "log",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -2560,7 +2618,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
"wasm-bindgen-backend", "wasm-bindgen-backend",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -2779,7 +2837,7 @@ version = "0.39.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
dependencies = [ dependencies = [
"bitflags", "bitflags 2.9.1",
] ]
[[package]] [[package]]
@ -2825,7 +2883,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
"synstructure", "synstructure",
] ]
@ -2846,7 +2904,7 @@ checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
] ]
[[package]] [[package]]
@ -2866,7 +2924,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
"synstructure", "synstructure",
] ]
@ -2906,5 +2964,5 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn", "syn 2.0.101",
] ]

View File

@ -56,6 +56,7 @@ bytemuck = "1.23.1"
flame = "0.2.2" flame = "0.2.2"
flamer = "0.5.0" flamer = "0.5.0"
rayon = "1.10.0" rayon = "1.10.0"
static_init = "1.0.4"
[dev-dependencies] [dev-dependencies]
criterion = "0.5" criterion = "0.5"

View File

@ -2,10 +2,7 @@ use std::{
cell::RefCell, cell::RefCell,
fs::File, fs::File,
path::PathBuf, path::PathBuf,
sync::{ sync::atomic::{AtomicU32, Ordering},
LazyLock,
atomic::{AtomicU32, Ordering},
},
time::Instant, time::Instant,
}; };
@ -18,6 +15,7 @@ use hashbrown::HashMap;
use log::{debug, error, info, trace}; use log::{debug, error, info, trace};
use memmap2::{Mmap, MmapOptions}; use memmap2::{Mmap, MmapOptions};
use rayon::iter::{IntoParallelIterator, ParallelIterator}; use rayon::iter::{IntoParallelIterator, ParallelIterator};
use static_init::dynamic;
type DynError = Box<dyn std::error::Error>; type DynError = Box<dyn std::error::Error>;
@ -438,7 +436,8 @@ fn prepare_initial_food(request: &Request) -> Box<[(u8, u8)]> {
x: (request.board.width - 1) / 2, x: (request.board.width - 1) / 2,
y: (request.board.height) / 2, y: (request.board.height) / 2,
}; };
let initial_food = request
request
.board .board
.snakes .snakes
.iter() .iter()
@ -499,8 +498,7 @@ fn prepare_initial_food(request: &Request) -> Box<[(u8, u8)]> {
.az(); .az();
(selected, possibilities) (selected, possibilities)
}) })
.collect(); .collect()
initial_food
} }
fn prepare_starts(request: &Request) -> (bool, [Option<u8>; 4], [Option<u8>; 4]) { fn prepare_starts(request: &Request) -> (bool, [Option<u8>; 4], [Option<u8>; 4]) {
@ -830,23 +828,26 @@ impl GoRand {
} }
} }
static CHAIN_RAW: LazyLock<Mmap> = LazyLock::new(|| unsafe { #[dynamic]
static CHAIN_RAW: Mmap = unsafe {
MmapOptions::new() MmapOptions::new()
.populate() .populate()
.map(&File::open("assets/chain").unwrap()) .map(&File::open("assets/chain").unwrap())
.unwrap() .unwrap()
}); };
static CHAIN: LazyLock<&[i32]> = LazyLock::new(|| cast_slice(&CHAIN_RAW)); #[dynamic]
static TABLE_RAW: LazyLock<Mmap> = static CHAIN: &'static [i32] = cast_slice(&CHAIN_RAW);
LazyLock::new(|| unsafe { Mmap::map(&File::open("assets/table").unwrap()).unwrap() }); #[dynamic]
static TABLE: LazyLock<&[u32]> = LazyLock::new(|| cast_slice(&TABLE_RAW)); 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)] #[derive(Debug, PartialEq, Eq, Clone)]
struct GoSource { struct GoSource {
tap: u16, tap: u16,
feed: u16, feed: u16,
base_x_index: usize, base_x_index: usize,
vec: HashMap<u16, i64>, state: HashMap<u16, i64>,
} }
impl GoSource { impl GoSource {
@ -871,7 +872,7 @@ impl GoSource {
tap: 0, tap: 0,
feed: Self::LEN - Self::TAP, feed: Self::LEN - Self::TAP,
base_x_index, base_x_index,
vec: HashMap::new(), state: HashMap::new(),
} }
} }
} }
@ -898,7 +899,7 @@ impl GoSource {
self.tap = 0; self.tap = 0;
self.feed = Self::LEN - Self::TAP; self.feed = Self::LEN - Self::TAP;
self.base_x_index = base_x_index; self.base_x_index = base_x_index;
self.vec.clear(); self.state.clear();
} }
//#[flame] //#[flame]
@ -910,29 +911,29 @@ impl GoSource {
let tap = self.tap; let tap = self.tap;
let feed = *self let feed = *self
.vec .state
.entry(feed) .entry(feed)
.or_insert_with(|| seed_one(self.base_x_index, feed)); .or_insert_with(|| seed_one(self.base_x_index, feed));
let tap = *self let tap = *self
.vec .state
.entry(tap) .entry(tap)
.or_insert_with(|| seed_one(self.base_x_index, tap)); .or_insert_with(|| seed_one(self.base_x_index, tap));
let x = feed.wrapping_add(tap); let x = feed.wrapping_add(tap);
self.vec.insert(self.feed, x); self.state.insert(self.feed, x);
x.wrapping_as() x.wrapping_as()
} }
} }
//#[flame] //#[flame]
fn seed_one(base: usize, i: u16) -> i64 { fn seed_one(base: usize, i: u16) -> i64 {
const LEN: usize = 0x7fff_fffe;
let i = usize::from(i); let i = usize::from(i);
let base = base + 20 + i * 3; let base = base + 20 + i * 3;
let len = CHAIN.len();
let (x1, x2, x3) = unsafe { let (x1, x2, x3) = unsafe {
let x1 = *CHAIN.get_unchecked(base % len); let x1 = *CHAIN.get_unchecked(base % LEN);
let x2 = *CHAIN.get_unchecked((base + 1) % len); let x2 = seedrand(x1);
let x3 = *CHAIN.get_unchecked((base + 2) % len); let x3 = seedrand(x2);
(x1, x2, x3) (x1, x2, x3)
}; };
let u = i64::from(x1) << 40; let u = i64::from(x1) << 40;