首頁 >後端開發 >Golang >與其他型別檢查方法相比,Go 的型別斷言和型別開關表現如何?

與其他型別檢查方法相比,Go 的型別斷言和型別開關表現如何?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-01 07:47:10333瀏覽

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()
        }
    }
}

在多個測試機器上,結果一致表明所有四種方法都以相似的速度執行:直接方法呼叫、介面實作、型別斷言和型別切換。以下範例示範了這些發現:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn