结论:基础数据类型和指针类型断言与反射不分伯仲,结构体类型反射更快。
这是 string类型判断的断言实现与反射实现和 float类型判断的断言实现与反射实现
func Func1(i interface{}) string {
_, ok := i.(string)
if ok {
return ""
}
return ""
}
func Func2(i interface{}) string {
reflect.TypeOf(i)
return ""
}
func Func3(i interface{}) int {
_, ok := i.(float32)
if ok {
return 1
}
return 2
}
func Func4(i interface{}) int {
reflect.TypeOf(i)
return 1
}
这是基准测试实现前四个是基础数据类型,5、6是结构体。7、8,是指针
func BenchmarkFunc1(b *testing.B) {
const str = "strtest"
//b.N由程序控制,它会动态分析资源的消耗从而控制b.N的规模
for i := 0; i < b.N; i++ {
fun.Func1(str)
}
}
func BenchmarkFunc2(b *testing.B) {
const str = "strtest"
//b.N由程序控制,它会动态分析资源的消耗从而控制b.N的规模
for i := 0; i < b.N; i++ {
fun.Func2(str)
}
}
func BenchmarkFunc3(b *testing.B) {
const number = 12.12
//b.N由程序控制,它会动态分析资源的消耗从而控制b.N的规模
for i := 0; i < b.N; i++ {
fun.Func3(number)
}
}
func BenchmarkFunc4(b *testing.B) {
const number = 12.12
//b.N由程序控制,它会动态分析资源的消耗从而控制b.N的规模
for i := 0; i < b.N; i++ {
fun.Func4(number)
}
}
type Test struct {
T3 int
T4 int
T1 string
T2 string
T5 float32
}
var t interface{} = Test{
T1: "123",
T2: "helloworld",
T3: 123,
T4: '1' - 1,
T5: 12.2111,
}
func BenchmarkFunc5(b *testing.B) {
//b.N由程序控制,它会动态分析资源的消耗从而控制b.N的规模
for i := 0; i < b.N; i++ {
_, ok := t.(Test)
if ok {
}
}
}
func BenchmarkFunc6(b *testing.B) {
//b.N由程序控制,它会动态分析资源的消耗从而控制b.N的规模
for i := 0; i < b.N; i++ {
reflect.TypeOf(t)
}
}
func BenchmarkFunc7(b *testing.B) {
var t1 interface{} = &t
//b.N由程序控制,它会动态分析资源的消耗从而控制b.N的规模
for i := 0; i < b.N; i++ {
_, ok := t1.(*Test)
if ok {
}
}
}
func BenchmarkFunc8(b *testing.B) {
//b.N由程序控制,它会动态分析资源的消耗从而控制b.N的规模
var t1 interface{} = &t
for i := 0; i < b.N; i++ {
reflect.TypeOf(t1)
}
}
结果:
1.
很明显 func5 比func6更加耗时