golang 随机数组的性能对比测试

最近需要用到随机数,但在随机数的生成方面遇到些问题,如加了 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,最差的就是通过时间戳了,性能一次在 纳秒、微妙和毫秒之间,差别还是挺大的,仅供参考。

posted on 2024-03-15 11:29  进击的davis  阅读(5)  评论(0编辑  收藏  举报

导航