github.com/bytedance/gopkg@v0.0.0-20240514070511-01b2cbcf35e1/lang/fastrand/readme.md (about) 1 # fastrand 2 3 Fastest pseudo-random number generator in Go. 4 5 This generator actually come from Go runtime per-M structure, and the init-seed is provided by Go runtime, which means you can't add your own seed, but these methods scales very well on multiple cores. 6 7 The generator passes the SmallCrush suite, part of TestU01 framework: http://simul.iro.umontreal.ca/testu01/tu01.html 8 9 pseudo-random paper: https://www.jstatsoft.org/article/view/v008i14/xorshift.pdf 10 11 fast-modulo-reduction: https://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/ 12 13 14 15 ## Compare to math/rand 16 17 - Much faster (~5x faster for single-core; ~200x faster for multiple-cores) 18 - Scales well on multiple cores 19 - **Not** provide a stable value stream (can't inject init-seed) 20 - Fix bugs in math/rand `Float64` and `Float32` (since no need to preserve the value stream) 21 22 23 24 ## Bencmark 25 26 Go version: go1.15.6 linux/amd64 27 28 CPU: AMD 3700x(8C16T), running at 3.6GHz 29 30 OS: ubuntu 18.04 31 32 MEMORY: 16G x 2 (3200MHz) 33 34 35 36 ##### multiple-cores 37 38 ``` 39 name time/op 40 MultipleCore/math/rand-Int31n(5)-16 152ns ± 0% 41 MultipleCore/fast-rand-Int31n(5)-16 0.40ns ± 0% 42 MultipleCore/math/rand-Int63n(5)-16 167ns ± 0% 43 MultipleCore/fast-rand-Int63n(5)-16 3.04ns ± 0% 44 MultipleCore/math/rand-Float32()-16 143ns ± 0% 45 MultipleCore/fast-rand-Float32()-16 0.40ns ± 0% 46 MultipleCore/math/rand-Uint32()-16 133ns ± 0% 47 MultipleCore/fast-rand-Uint32()-16 0.23ns ± 0% 48 MultipleCore/math/rand-Uint64()-16 140ns ± 0% 49 MultipleCore/fast-rand-Uint64()-16 0.56ns ± 0% 50 ``` 51 52 53 54 ##### single-core 55 56 ``` 57 name time/op 58 SingleCore/math/rand-Int31n(5)-16 15.5ns ± 0% 59 SingleCore/fast-rand-Int31n(5)-16 3.91ns ± 0% 60 SingleCore/math/rand-Int63n(5)-16 24.4ns ± 0% 61 SingleCore/fast-rand-Int63n(5)-16 24.4ns ± 0% 62 SingleCore/math/rand-Uint32()-16 10.9ns ± 0% 63 SingleCore/fast-rand-Uint32()-16 2.86ns ± 0% 64 SingleCore/math/rand-Uint64()-16 11.3ns ± 0% 65 SingleCore/fast-rand-Uint64()-16 5.88ns ± 0% 66 ``` 67 68 69 70 ##### compare to other repo 71 72 (multiple-cores) 73 74 rand-1 -> this repo 75 76 rand-2 -> https://github.com/valyala/fastrand 77 78 ``` 79 name time/op 80 VS/fastrand-1-Uint32()-16 0.23ns ± 0% 81 VS/fastrand-2-Uint32()-16 3.04ns ±23% 82 VS/fastrand-1-Uint32n(5)-16 0.23ns ± 1% 83 VS/fastrand-2-Uint32n(5)-16 3.13ns ±32% 84 ``` 85