ホームページ >バックエンド開発 >Golang >Go の型アサーションと型スイッチは他の型チェック手法と比較してどのように実行されますか?

Go の型アサーションと型スイッチは他の型チェック手法と比較してどのように実行されますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-01 07:47:10332ブラウズ

How Do Go's Type Assertions and Type Switches Perform Compared to Other Type-Checking Methodologies?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。