Heim >Backend-Entwicklung >Golang >Wie funktionieren die Typzusicherungen und Typwechsel von Go im Vergleich zu anderen Typprüfungsmethoden?

Wie funktionieren die Typzusicherungen und Typwechsel von Go im Vergleich zu anderen Typprüfungsmethoden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-01 07:47:10339Durchsuche

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

Typzusicherung und Switch-Leistung in Go

In Programmiersprachen ist die Bestimmung des Typs einer Variablen oder eines Objekts während der Laufzeit ein grundlegender Vorgang. Go verwendet Typzusicherungen und Typschalter, um diesen Prozess zu erleichtern. Dieser Artikel befasst sich mit den Leistungsmerkmalen dieser Techniken.

Leistungsbedenken

In einigen Sprachen wie C/C kann die Erkennung von Laufzeittypen zu Leistungseinbußen führen. Go-Programmierer haben darüber nachgedacht, ob Typzusicherungen oder Typschalter ähnliche Ineffizienzen aufweisen. Um dies zu beheben, führen wir einen umfassenden Benchmark durch:

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

Der Beispielcode verwendet einen Typschalter, um den Typ der Eingabevariablen zu bestimmen.

Benchmark-Vergleich

Eine Reihe von Benchmark-Tests wurde durchgeführt, um die Leistung von Typzusicherungen und -schaltern mit direkten Methodenaufrufen und Schnittstellen zu vergleichen Implementierungen:

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

Auf mehreren Testmaschinen zeigen die Ergebnisse durchweg, dass alle vier Methoden mit ähnlichen Geschwindigkeiten arbeiten: direkte Methodenaufrufe, Schnittstellenimplementierungen, Typzusicherungen und Typwechsel. Das folgende Beispiel veranschaulicht diese Ergebnisse:

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

Daher ist unsere Schlussfolgerung, dass Typzusicherungen und Typwechsel in Go im Vergleich zu anderen Typprüfungsmethoden keine spürbaren Leistungseinbußen mit sich bringen.

Das obige ist der detaillierte Inhalt vonWie funktionieren die Typzusicherungen und Typwechsel von Go im Vergleich zu anderen Typprüfungsmethoden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn