時,我有一個生成一個隨機int64
並將它作爲一個interface{}
這樣的功能:額外的內存分配返回接口{}而不是Int64的
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{}
時可以避免嗎?
一如既往@icza你是值得你等重的黃金 –