测试代码
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