Go 中的類型斷言和切換性能
在程式語言中,在運行時確定變數或物件的類型是一項基本操作。 Go 使用型別斷言和型別開關來促進此流程。本文深入探討了這些技術的性能特性。
效能問題
在某些語言(如 C/C)中,執行時間類型發現可能會導致效能損失。 Go 程式設計師思考過類型斷言或類型切換是否表現出類似的低效率。為了解決這個問題,讓我們執行一個全面的基準測試:
package main import ( "fmt" "testing" ) func question(anything interface{}) { switch v := anything.(type) { case string: fmt.Println(v) case int32, int64: fmt.Println(v) case SomeCustomType: fmt.Println(v) default: fmt.Println("unknown") } }
範例程式碼使用類型開關來確定輸入變數的類型為任何內容。
基準比較
進行了一系列基準測試,以比較類型斷言和開關與直接方法調用和接口的性能實現:
package main import ( "testing" ) type myint int64 type Inccer interface { inc() } func (i *myint) inc() { *i = *i + 1 } func BenchmarkIntmethod(b *testing.B) { i := new(myint) incnIntmethod(i, b.N) } func BenchmarkInterface(b *testing.B) { i := new(myint) incnInterface(i, b.N) } func BenchmarkTypeSwitch(b *testing.B) { i := new(myint) incnSwitch(i, b.N) } func BenchmarkTypeAssertion(b *testing.B) { i := new(myint) incnAssertion(i, b.N) } func incnIntmethod(i *myint, n int) { for k := 0; k < n; k++ { i.inc() } } func incnInterface(any Inccer, n int) { for k := 0; k < n; k++ { any.inc() } } func incnSwitch(any Inccer, n int) { for k := 0; k < n; k++ { switch v := any.(type) { case *myint: v.inc() } } } func incnAssertion(any Inccer, n int) { for k := 0; k < n; k++ { if newint, ok := any.(*myint); ok { newint.inc() } } }
在多個測試機器上,結果一致表明所有四種方法都以相似的速度執行:直接方法呼叫、介面實作、型別斷言和型別切換。以下範例示範了這些發現:
BenchmarkIntmethod-16 2000000000 1.67 ns/op BenchmarkInterface-16 1000000000 2.03 ns/op BenchmarkTypeSwitch-16 2000000000 1.70 ns/op BenchmarkTypeAssertion-16 2000000000 1.67 ns/op
因此,我們的結論是,與其他類型檢查方法相比,Go 中的類型斷言和類型切換不會導致明顯的效能損失。
以上是與其他型別檢查方法相比,Go 的型別斷言和型別開關表現如何?的詳細內容。更多資訊請關注PHP中文網其他相關文章!