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 중국어 웹사이트의 기타 관련 기사를 참조하세요!