pgregory.net/rand@v1.0.3-0.20230808192358-a0b8ce02f4da/rand_bench_std_test.go (about) 1 // Copyright 2022 Gregory Petrosyan <gregory.petrosyan@gmail.com> 2 // 3 // This Source Code Form is subject to the terms of the Mozilla Public 4 // License, v. 2.0. If a copy of the MPL was not distributed with this 5 // file, You can obtain one at https://mozilla.org/MPL/2.0/. 6 7 //go:build benchstd 8 9 package rand_test 10 11 import ( 12 "math" 13 "math/rand" 14 "testing" 15 ) 16 17 var ( 18 sinkRand *rand.Rand 19 ) 20 21 func BenchmarkUint64(b *testing.B) { 22 b.RunParallel(func(pb *testing.PB) { 23 var s uint64 24 b.SetBytes(8) 25 for pb.Next() { 26 s = rand.Uint64() 27 } 28 sinkUint64 = s 29 }) 30 } 31 32 func BenchmarkFloat64(b *testing.B) { 33 b.RunParallel(func(pb *testing.PB) { 34 var s float64 35 for pb.Next() { 36 s = rand.Float64() 37 } 38 sinkFloat64 = s 39 }) 40 } 41 42 func BenchmarkIntn(b *testing.B) { 43 b.RunParallel(func(pb *testing.PB) { 44 var s int 45 for pb.Next() { 46 s = rand.Intn(small) 47 } 48 sinkInt = s 49 }) 50 } 51 52 func BenchmarkIntn_Big(b *testing.B) { 53 b.RunParallel(func(pb *testing.PB) { 54 var s int 55 for pb.Next() { 56 s = rand.Intn(math.MaxInt - small) 57 } 58 sinkInt = s 59 }) 60 } 61 62 func BenchmarkRand_New(b *testing.B) { 63 var s *rand.Rand 64 b.ReportAllocs() 65 for i := 0; i < b.N; i++ { 66 s = rand.New(rand.NewSource(int64(i))) 67 } 68 sinkRand = s 69 } 70 71 func BenchmarkRand_ExpFloat64(b *testing.B) { 72 var s float64 73 r := rand.New(rand.NewSource(1)) 74 for i := 0; i < b.N; i++ { 75 s = r.ExpFloat64() 76 } 77 sinkFloat64 = s 78 } 79 80 func BenchmarkRand_Float32(b *testing.B) { 81 var s float32 82 r := rand.New(rand.NewSource(1)) 83 for i := 0; i < b.N; i++ { 84 s = r.Float32() 85 } 86 sinkFloat32 = s 87 } 88 89 func BenchmarkRand_Float64(b *testing.B) { 90 var s float64 91 r := rand.New(rand.NewSource(1)) 92 for i := 0; i < b.N; i++ { 93 s = r.Float64() 94 } 95 sinkFloat64 = s 96 } 97 98 func BenchmarkRand_Int(b *testing.B) { 99 var s int 100 r := rand.New(rand.NewSource(1)) 101 for i := 0; i < b.N; i++ { 102 s = r.Int() 103 } 104 sinkInt = s 105 } 106 107 func BenchmarkRand_Int31(b *testing.B) { 108 var s int32 109 r := rand.New(rand.NewSource(1)) 110 for i := 0; i < b.N; i++ { 111 s = r.Int31() 112 } 113 sinkInt32 = s 114 } 115 116 func BenchmarkRand_Int31n(b *testing.B) { 117 var s int32 118 r := rand.New(rand.NewSource(1)) 119 for i := 0; i < b.N; i++ { 120 s = r.Int31n(small) 121 } 122 sinkInt32 = s 123 } 124 125 func BenchmarkRand_Int31n_Big(b *testing.B) { 126 var s int32 127 r := rand.New(rand.NewSource(1)) 128 for i := 0; i < b.N; i++ { 129 s = r.Int31n(math.MaxInt32 - small) 130 } 131 sinkInt32 = s 132 } 133 134 func BenchmarkRand_Int63(b *testing.B) { 135 var s int64 136 r := rand.New(rand.NewSource(1)) 137 for i := 0; i < b.N; i++ { 138 s = r.Int63() 139 } 140 sinkInt64 = s 141 } 142 143 func BenchmarkRand_Int63n(b *testing.B) { 144 var s int64 145 r := rand.New(rand.NewSource(1)) 146 for i := 0; i < b.N; i++ { 147 s = r.Int63n(small) 148 } 149 sinkInt64 = s 150 } 151 152 func BenchmarkRand_Int63n_Big(b *testing.B) { 153 var s int64 154 r := rand.New(rand.NewSource(1)) 155 for i := 0; i < b.N; i++ { 156 s = r.Int63n(math.MaxInt64 - small) 157 } 158 sinkInt64 = s 159 } 160 161 func BenchmarkRand_Intn(b *testing.B) { 162 var s int 163 r := rand.New(rand.NewSource(1)) 164 for i := 0; i < b.N; i++ { 165 s = r.Intn(small) 166 } 167 sinkInt = s 168 } 169 170 func BenchmarkRand_Intn_Big(b *testing.B) { 171 var s int 172 r := rand.New(rand.NewSource(1)) 173 for i := 0; i < b.N; i++ { 174 s = r.Intn(math.MaxInt - small) 175 } 176 sinkInt = s 177 } 178 179 func BenchmarkRand_NormFloat64(b *testing.B) { 180 var s float64 181 r := rand.New(rand.NewSource(1)) 182 for i := 0; i < b.N; i++ { 183 s = r.NormFloat64() 184 } 185 sinkFloat64 = s 186 } 187 188 func BenchmarkRand_Perm(b *testing.B) { 189 b.ReportAllocs() 190 r := rand.New(rand.NewSource(1)) 191 for i := 0; i < b.N; i++ { 192 r.Perm(tiny) 193 } 194 } 195 196 func BenchmarkRand_Read(b *testing.B) { 197 r := rand.New(rand.NewSource(1)) 198 p := make([]byte, 256) 199 b.SetBytes(int64(len(p))) 200 for i := 0; i < b.N; i++ { 201 _, _ = r.Read(p[:]) 202 } 203 } 204 205 func BenchmarkRand_Seed(b *testing.B) { 206 r := rand.New(rand.NewSource(1)) 207 for i := 0; i < b.N; i++ { 208 r.Seed(int64(i)) 209 } 210 } 211 212 func BenchmarkRand_Shuffle(b *testing.B) { 213 r := rand.New(rand.NewSource(1)) 214 a := make([]int, tiny) 215 for i := 0; i < b.N; i++ { 216 r.Shuffle(len(a), func(i, j int) { a[i], a[j] = a[j], a[i] }) 217 } 218 } 219 220 func BenchmarkRand_ShuffleOverhead(b *testing.B) { 221 r := rand.New(rand.NewSource(1)) 222 a := make([]int, tiny) 223 for i := 0; i < b.N; i++ { 224 r.Shuffle(len(a), func(i, j int) {}) 225 } 226 } 227 228 func BenchmarkRand_Uint32(b *testing.B) { 229 var s uint32 230 r := rand.New(rand.NewSource(1)) 231 b.SetBytes(4) 232 for i := 0; i < b.N; i++ { 233 s = r.Uint32() 234 } 235 sinkUint32 = s 236 } 237 238 func BenchmarkRand_Uint64(b *testing.B) { 239 var s uint64 240 r := rand.New(rand.NewSource(1)) 241 b.SetBytes(8) 242 for i := 0; i < b.N; i++ { 243 s = r.Uint64() 244 } 245 sinkUint64 = s 246 }