【发布时间】:2018-01-03 03:25:03
【问题描述】:
我有一个函数可以生成一个随机的int64 并将其作为interface{} 返回,如下所示:
func Val1(rnd rand.Source) interface{} {
return rnd.Int63()
}
现在考虑这个函数,它做同样的事情但返回一个int64
func Val2(rnd rand.Source) int64 {
return rnd.Int63()
}
我用这个(go test -bench=. -benchmem)对这两个函数进行了基准测试:
func BenchmarkVal1(b *testing.B) {
var rnd = rand.NewSource(time.Now().UnixNano())
for n := 0; n < b.N; n++ {
Val1(rnd)
}
}
func BenchmarkVal2(b *testing.B) {
var rnd = rand.NewSource(time.Now().UnixNano())
for n := 0; n < b.N; n++ {
Val2(rnd)
}
}
得到以下结果:
BenchmarkVal1-4 50000000 32.4 ns/op 8 B/op 1 allocs/op
BenchmarkVal2-4 200000000 7.47 ns/op 0 B/op 0 allocs/op
Val1() 中的额外分配从何而来?返回 interface{} 时可以避免吗?
【问题讨论】:
标签: object memory go types allocation