From f21cce4b6929222724c3b1097242850c58712620 Mon Sep 17 00:00:00 2001 From: Mike <45243121+tankf33der@users.noreply.github.com> Date: Sat, 20 Dec 2025 18:18:36 +0200 Subject: [PATCH] rand.wyrand: switch to using the original C._wymix() as a performance optimisation (#26051) --- vlib/rand/wyrand/wyrand.js.v | 13 +++++++++++++ vlib/rand/wyrand/wyrand.v | 13 ------------- vlib/rand/wyrand/z_wyrand.c.v | 14 ++++++++++++++ 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/vlib/rand/wyrand/wyrand.js.v b/vlib/rand/wyrand/wyrand.js.v index 1e5d4b442..27f0583c0 100644 --- a/vlib/rand/wyrand/wyrand.js.v +++ b/vlib/rand/wyrand/wyrand.js.v @@ -1,3 +1,16 @@ module wyrand +import hash + pub fn (mut r WyRandRNG) free() {} + +@[ignore_overflow; inline] +pub fn (mut rng WyRandRNG) u64() u64 { + unsafe { + mut seed1 := rng.state + seed1 += wyp0 + rng.state = seed1 + return hash.wymum(seed1 ^ wyp1, seed1) + } + return 0 +} diff --git a/vlib/rand/wyrand/wyrand.v b/vlib/rand/wyrand/wyrand.v index 6db79bb69..6a792fd67 100644 --- a/vlib/rand/wyrand/wyrand.v +++ b/vlib/rand/wyrand/wyrand.v @@ -3,7 +3,6 @@ // that can be found in the LICENSE file. module wyrand -import hash import rand.buffer import rand.seed @@ -81,18 +80,6 @@ pub fn (mut rng WyRandRNG) u32() u32 { return u32(ans) } -// u64 returns a pseudorandom 64bit int in range `[0, 2⁶⁴)`. -@[ignore_overflow; inline] -pub fn (mut rng WyRandRNG) u64() u64 { - unsafe { - mut seed1 := rng.state - seed1 += wyp0 - rng.state = seed1 - return hash.wymum(seed1 ^ wyp1, seed1) - } - return 0 -} - // block_size returns the number of bits that the RNG can produce in a single iteration. @[inline] pub fn (mut rng WyRandRNG) block_size() int { diff --git a/vlib/rand/wyrand/z_wyrand.c.v b/vlib/rand/wyrand/z_wyrand.c.v index aa897c26e..f95e87632 100644 --- a/vlib/rand/wyrand/z_wyrand.c.v +++ b/vlib/rand/wyrand/z_wyrand.c.v @@ -1,7 +1,21 @@ module wyrand +fn C._wymix(u64, u64) u64 + // free should be called when the generator is no longer needed @[unsafe] pub fn (mut rng WyRandRNG) free() { unsafe { free(rng) } } + +// u64 returns a pseudorandom 64bit int in range `[0, 2⁶⁴)`. +@[ignore_overflow; inline] +pub fn (mut rng WyRandRNG) u64() u64 { + unsafe { + mut seed1 := rng.state + seed1 += wyp0 + rng.state = seed1 + return C._wymix(seed1 ^ wyp1, seed1) + } + return 0 +} -- 2.39.5