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_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",
]

View File

@ -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"

View File

@ -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<dyn std::error::Error>;
@ -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<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()
.populate()
.map(&File::open("assets/chain").unwrap())
.unwrap()
});
static CHAIN: LazyLock<&[i32]> = LazyLock::new(|| cast_slice(&CHAIN_RAW));
static TABLE_RAW: LazyLock<Mmap> =
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<u16, i64>,
state: HashMap<u16, i64>,
}
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;