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() } } }
複数のテスト マシンでの結果は、直接メソッド呼び出し、インターフェイス実装、型アサーション、型スイッチの 4 つのメソッドすべてが同様の速度で実行されることを一貫して示しています。次の例は、これらの結果を示しています。
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 中国語 Web サイトの他の関連記事を参照してください。