這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
轉載自達達的部落格
在一些通用化的介面設計中,我們不得不用interface{}來代表任意類型,然後在介面內部用類型轉換來判斷具體類型,從而執行具體邏輯。但是類型判斷是有效能代價的,如果能具像化的知道這個效能代價有多大,就可以協助我們設計介面的時候判斷應該怎麼設計。
下面是實驗代碼(github):
package labs01import "testing"type InterfaceA interface { AA()}type InterfaceB interface { BB()}type A struct { v int}func (a *A) AA() { a.v += 1}type B struct { v int}func (b *B) BB() { b.v += 1}func TypeSwitch(v interface{}) { switch v.(type) { case InterfaceA: v.(InterfaceA).AA() case InterfaceB: v.(InterfaceB).BB() }}func NormalSwitch(a *A) { a.AA()}func InterfaceSwitch(v interface{}) { v.(InterfaceA).AA()}func Benchmark_TypeSwitch(b *testing.B) { var a = new(A) for i := 0; i < b.N; i++ { TypeSwitch(a) }}func Benchmark_NormalSwitch(b *testing.B) { var a = new(A) for i := 0; i < b.N; i++ { NormalSwitch(a) }}func Benchmark_InterfaceSwitch(b *testing.B) { var a = new(A) for i := 0; i < b.N; i++ { InterfaceSwitch(a) }}
執行結果:
dada-imac:misc dada$ go test -test.bench=".*" labs01testing: warning: no tests to runPASSBenchmark_TypeSwitch 50000000 33.0 ns/opBenchmark_NormalSwitch 2000000000 1.99 ns/opBenchmark_InterfaceSwitch 100000000 18.4 ns/opok labs 7.741s
結論:類型判斷和類型轉換這兩個操作都比直接操作多幾倍的消耗。