mirror of https://github.com/golang/go.git
reflect, internal/abi: speed up TypeFor[T]
goos: linux
goarch: amd64
pkg: reflect
cpu: AMD Ryzen 5 4600G with Radeon Graphics
│ /tmp/before │ /tmp/after │
│ sec/op │ sec/op vs base │
TypeForString-12 2.091n ± 1% 1.174n ± 1% -43.84% (p=0.000 n=20)
TypeForError-12 7.5810n ± 3% 0.9372n ± 1% -87.64% (p=0.000 n=20)
Change-Id: I22022f99b2dd2029f02d9ed8477b209adf7e9496
GitHub-Last-Rev: 64d2ac5bb2
GitHub-Pull-Request: golang/go#71654
Reviewed-on: https://go-review.googlesource.com/c/go/+/648395
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
This commit is contained in:
parent
fb5f78a14f
commit
679cd8e779
|
|
@ -187,11 +187,7 @@ func TypeOf(a any) *Type {
|
|||
|
||||
// TypeFor returns the abi.Type for a type parameter.
|
||||
func TypeFor[T any]() *Type {
|
||||
var v T
|
||||
if t := TypeOf(v); t != nil {
|
||||
return t // optimize for T being a non-interface kind
|
||||
}
|
||||
return TypeOf((*T)(nil)).Elem() // only for an interface kind
|
||||
return (*PtrType)(unsafe.Pointer(TypeOf((*T)(nil)))).Elem
|
||||
}
|
||||
|
||||
func (t *Type) Kind() Kind { return t.Kind_ & KindMask }
|
||||
|
|
|
|||
|
|
@ -1303,6 +1303,11 @@ func TypeOf(i any) Type {
|
|||
return toType(abi.TypeOf(i))
|
||||
}
|
||||
|
||||
// TypeFor returns the [Type] that represents the type argument T.
|
||||
func TypeFor[T any]() Type {
|
||||
return toType(abi.TypeFor[T]())
|
||||
}
|
||||
|
||||
// rtypeOf directly extracts the *rtype of the provided value.
|
||||
func rtypeOf(i any) *abi.Type {
|
||||
return abi.TypeOf(i)
|
||||
|
|
@ -2850,12 +2855,3 @@ func addTypeBits(bv *bitVector, offset uintptr, t *abi.Type) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TypeFor returns the [Type] that represents the type argument T.
|
||||
func TypeFor[T any]() Type {
|
||||
var v T
|
||||
if t := TypeOf(v); t != nil {
|
||||
return t // optimize for T being a non-interface kind
|
||||
}
|
||||
return TypeOf((*T)(nil)).Elem() // only for an interface kind
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue