>백엔드 개발 >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으로 문의하세요.