golang笔记之interface类型判断性能


快速导航

测试代码

  1package main
  2
  3import "testing"
  4
  5type InterfaceA interface {
  6    AA()
  7}
  8
  9type InterfaceB interface {
 10    BB()
 11}
 12
 13type A struct {
 14    v int
 15}
 16
 17func (a *A) AA() {
 18    a.v += 1
 19}
 20
 21func BenchmarkTypeSwitch(b *testing.B) {
 22    var a = new(A)
 23
 24    switchFunc := func(v interface{}) {
 25        switch v.(type) {
 26        case InterfaceA:
 27            v.(InterfaceA).AA()
 28        case InterfaceB:
 29            v.(InterfaceB).BB()
 30        }
 31    }
 32    for i := 0; i < b.N; i++ {
 33        switchFunc(a)
 34    }
 35}
 36
 37func BenchmarkNormalSwitch(b *testing.B) {
 38    var a = new(A)
 39
 40    switchFunc := func(v *A) {
 41        v.AA()
 42    }
 43    for i := 0; i < b.N; i++ {
 44        switchFunc(a)
 45    }
 46}
 47
 48func BenchmarkInterfaceSwitch(b *testing.B) {
 49    var a = new(A)
 50
 51    switchFunc := func(v interface{}) {
 52        v.(InterfaceA).AA()
 53    }
 54    for i := 0; i < b.N; i++ {
 55        switchFunc(a)
 56    }
 57}
 58
 59func BenchmarkInterfaceSwitch1(b *testing.B) {
 60    var a = new(A)
 61
 62    switchFunc := func(v interface{}) {
 63        v.(*A).AA()
 64    }
 65    for i := 0; i < b.N; i++ {
 66        switchFunc(a)
 67    }
 68}
 69
 70func BenchmarkInterfaceSwitch2(b *testing.B) {
 71    var a = new(A)
 72
 73    switchFunc := func(v InterfaceA) {
 74        v.(*A).AA()
 75    }
 76    for i := 0; i < b.N; i++ {
 77        switchFunc(a)
 78    }
 79}
 80
 81func BenchmarkInterfaceSwitch3(b *testing.B) {
 82    var a = new(A)
 83
 84    switchFunc := func(v InterfaceA) {
 85        v.AA()
 86    }
 87    for i := 0; i < b.N; i++ {
 88        switchFunc(a)
 89    }
 90}
 91
 92func BenchmarkNormalListSwitch(b *testing.B) {
 93    a := make([]*A, 10000)
 94    for i := range a {
 95        a[i] = new(A)
 96    }
 97
 98    switchFunc := func(vv []*A) {
 99        for _, v := range vv {
100            v.AA()
101        }
102    }
103    for i := 0; i < b.N; i++ {
104        switchFunc(a)
105    }
106}
107
108func BenchmarkInterfaceListSwitch(b *testing.B) {
109    a := make([]*A, 10000)
110    for i := range a {
111        a[i] = new(A)
112    }
113
114    switchFunc := func(vv interface{}) {
115        for _, v := range vv.([]*A) {
116            v.AA()
117        }
118    }
119    for i := 0; i < b.N; i++ {
120        switchFunc(a)
121    }
122}
123
124func BenchmarkInterfaceListSwitch1(b *testing.B) {
125    a := make([]InterfaceA, 10000)
126    for i := range a {
127        a[i] = new(A)
128    }
129
130    switchFunc := func(vv interface{}) {
131        for _, v := range vv.([]InterfaceA) {
132            v.AA()
133        }
134    }
135    for i := 0; i < b.N; i++ {
136        switchFunc(a)
137    }
138}
139
140func BenchmarkInterfaceListSwitch2(b *testing.B) {
141    a := make([]InterfaceA, 10000)
142    for i := range a {
143        a[i] = new(A)
144    }
145
146    switchFunc := func(vv []InterfaceA) {
147        for _, v := range vv {
148            v.AA()
149        }
150    }
151    for i := 0; i < b.N; i++ {
152        switchFunc(a)
153    }
154}

测试结果

 1└──╼ go test -test.bench=".*" .
 2goos: darwin
 3goarch: amd64
 4pkg: log2
 5cpu: Intel(R) Core(TM) i5-8279U CPU @ 2.40GHz
 6BenchmarkTypeSwitch-8                 72261417            16.89 ns/op
 7BenchmarkNormalSwitch-8               861871533            1.384 ns/op
 8BenchmarkInterfaceSwitch-8            148360124            8.370 ns/op
 9BenchmarkInterfaceSwitch1-8           780127671            1.537 ns/op
10BenchmarkInterfaceSwitch2-8           774663793            1.538 ns/op
11BenchmarkInterfaceSwitch3-8           739255111            1.628 ns/op
12BenchmarkNormalListSwitch-8             225832          5346 ns/op
13BenchmarkInterfaceListSwitch-8          252312          4820 ns/op
14BenchmarkInterfaceListSwitch1-8          61461         19800 ns/op
15BenchmarkInterfaceListSwitch2-8          60193         20142 ns/op
16PASS
17ok    log2	14.670s
作者: honmaple
链接: https://honmaple.me/articles/2020/08/golang笔记之interface类型判断性能.html
版权: CC BY-NC-SA 4.0 知识共享署名-非商业性使用-相同方式共享4.0国际许可协议
wechat
alipay

加载评论