测试代码
package main
import "testing"
type InterfaceA interface {
AA()
}
type InterfaceB interface {
BB()
}
type A struct {
v int
}
func (a *A) AA() {
a.v += 1
}
func BenchmarkTypeSwitch(b *testing.B) {
var a = new(A)
switchFunc := func(v interface{}) {
switch v.(type) {
case InterfaceA:
v.(InterfaceA).AA()
case InterfaceB:
v.(InterfaceB).BB()
}
}
for i := 0; i < b.N; i++ {
switchFunc(a)
}
}
func BenchmarkNormalSwitch(b *testing.B) {
var a = new(A)
switchFunc := func(v *A) {
v.AA()
}
for i := 0; i < b.N; i++ {
switchFunc(a)
}
}
func BenchmarkInterfaceSwitch(b *testing.B) {
var a = new(A)
switchFunc := func(v interface{}) {
v.(InterfaceA).AA()
}
for i := 0; i < b.N; i++ {
switchFunc(a)
}
}
func BenchmarkInterfaceSwitch1(b *testing.B) {
var a = new(A)
switchFunc := func(v interface{}) {
v.(*A).AA()
}
for i := 0; i < b.N; i++ {
switchFunc(a)
}
}
func BenchmarkInterfaceSwitch2(b *testing.B) {
var a = new(A)
switchFunc := func(v InterfaceA) {
v.(*A).AA()
}
for i := 0; i < b.N; i++ {
switchFunc(a)
}
}
func BenchmarkInterfaceSwitch3(b *testing.B) {
var a = new(A)
switchFunc := func(v InterfaceA) {
v.AA()
}
for i := 0; i < b.N; i++ {
switchFunc(a)
}
}
func BenchmarkNormalListSwitch(b *testing.B) {
a := make([]*A, 10000)
for i := range a {
a[i] = new(A)
}
switchFunc := func(vv []*A) {
for _, v := range vv {
v.AA()
}
}
for i := 0; i < b.N; i++ {
switchFunc(a)
}
}
func BenchmarkInterfaceListSwitch(b *testing.B) {
a := make([]*A, 10000)
for i := range a {
a[i] = new(A)
}
switchFunc := func(vv interface{}) {
for _, v := range vv.([]*A) {
v.AA()
}
}
for i := 0; i < b.N; i++ {
switchFunc(a)
}
}
func BenchmarkInterfaceListSwitch1(b *testing.B) {
a := make([]InterfaceA, 10000)
for i := range a {
a[i] = new(A)
}
switchFunc := func(vv interface{}) {
for _, v := range vv.([]InterfaceA) {
v.AA()
}
}
for i := 0; i < b.N; i++ {
switchFunc(a)
}
}
func BenchmarkInterfaceListSwitch2(b *testing.B) {
a := make([]InterfaceA, 10000)
for i := range a {
a[i] = new(A)
}
switchFunc := func(vv []InterfaceA) {
for _, v := range vv {
v.AA()
}
}
for i := 0; i < b.N; i++ {
switchFunc(a)
}
}
测试结果
└──╼ go test -test.bench=".*" .
goos: darwin
goarch: amd64
pkg: log2
cpu: Intel(R) Core(TM) i5-8279U CPU @ 2.40GHz
BenchmarkTypeSwitch-8 72261417 16.89 ns/op
BenchmarkNormalSwitch-8 861871533 1.384 ns/op
BenchmarkInterfaceSwitch-8 148360124 8.370 ns/op
BenchmarkInterfaceSwitch1-8 780127671 1.537 ns/op
BenchmarkInterfaceSwitch2-8 774663793 1.538 ns/op
BenchmarkInterfaceSwitch3-8 739255111 1.628 ns/op
BenchmarkNormalListSwitch-8 225832 5346 ns/op
BenchmarkInterfaceListSwitch-8 252312 4820 ns/op
BenchmarkInterfaceListSwitch1-8 61461 19800 ns/op
BenchmarkInterfaceListSwitch2-8 60193 20142 ns/op
PASS
ok log2 14.670s