2017-07-27 47 views
0

時,我有一個生成一個隨機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{}時可以避免嗎?

回答

5

接口值是引擎蓋下的一個包裝,一對存儲在接口值和它的類型描述符中的具體值。

閱讀以瞭解更多信息:The Laws of Reflection #The representation of an interface

所以,如果你想返回,一個interface{}值將隱含創建(如果返回值是不是已經該類型的)interface{}類型的值,這將保持整數和其類型描述符表示int64類型。你無法避免這一點。

interface{}是一種特殊的接口類型(有0個方法)。它的值只有8個字節,正如你在基準輸出中看到的那樣。其他接口類型具有較大的尺寸(雙倍),因爲它們還必須識別接口類型的靜態方法集(除了動態類型和值之外)。

此外,一定要看看這個信息答案:Go: What's the meaning of interface{}?

如果您想了解執行/內部的詳細信息,我建議這個帖子:How Interfaces Work in Golang

+1

一如既往@icza你是值得你等重的黃金 –

相關問題