最近需要用到随机数,但在随机数的生成方面遇到些问题,如加了 seed 后反而生成的数组是固定的,没有加是随机的,后面查资料了解到,如果 seed 值是一样的,序列中的值就固定的,而不加 seed 时,每次的都是随机的,后面想到如果用来做负载均衡呢,性能又如何。
下面是源码:
package bench
import (
"math/rand"
"time"
)
// 性能次之, us level
func randWithSeed() {
rand.Seed(time.Now().UnixNano())
nums := []int{}
for i := 0; i < 10; i++ {
nums = append(nums, rand.Intn(100))
}
}
// 性能最好,ns level
func randWithoutSeed() {
nums := []int{}
for i := 0; i < 10; i++ {
nums = append(nums, rand.Intn(100))
}
}
// 性能最差, ms level
func randByTimestampMod() {
nums := []int64{}
for i := 0; i < 10; i++ {
num := time.Now().UnixMicro()
nums = append(nums, num % 10)
time.Sleep(time.Microsecond)
}
}
性能测试源码:
package bench
import "testing"
func BenchmarkRandByTimeSeed(b *testing.B) {
for i := 0; i < b.N; i++ {
randWithSeed()
}
}
func BenchmarkRandWithOutSeed(b *testing.B) {
for i := 0; i < b.N; i++ {
randWithoutSeed()
}
}
func BenchmarkRandByTimestamp(b *testing.B) {
for i := 0; i < b.N; i++ {
randByTimestampMod()
}
}
测试结果:
$ go test -bench=. -benchtime=5s -benchmem
goos: windows
goarch: amd64
pkg: go-antsDemo/bench
cpu: AMD Ryzen 7 4700U with Radeon Graphics
BenchmarkRandByTimeSeed-8 709338 8415 ns/op 248 B/op 5 allocs/op
BenchmarkRandWithOutSeed-8 19385298 305.7 ns/op 248 B/op 5 allocs/op
BenchmarkRandByTimestamp-8 44 150723675 ns/op 250 B/op 5 allocs/op
PASS
ok go-antsDemo/bench 19.103s
可以看到 直接调用 rand.Intn性能是最好的,其次是调用 Seed 下再调用 rand.Intn,最差的就是通过时间戳了,性能一次在 纳秒、微妙和毫秒之间,差别还是挺大的,仅供参考。
标签:rand,func,随机数,nums,++,bench,golang,测试,op From: https://www.cnblogs.com/davis12/p/18075066