测试代码:
package main
import (
"testing"
)
type InterfaceA interface {
Name() string
}
type InterfaceB interface {
Name() string
Add()
}
type A struct {
v int
}
func (*A) Name() string {
return "A"
}
func (a *A) Add() {
a.v += 1
}
type B struct {
A
}
func (*B) Name() string {
return "B"
}
func BenchmarkNormal(b *testing.B) {
switchFunc := func(v *A) {
v.Add()
}
for i := 0; i < b.N; i++ {
v := new(A)
switchFunc(v)
}
}
func BenchmarkInterface(b *testing.B) {
switchFunc := func(v interface{}) {
switch n := v.(type) {
case *A:
n.Add()
case *B:
n.Add()
}
}
for i := 0; i < b.N; i++ {
v := new(A)
switchFunc(v)
}
}
func BenchmarkInterface1(b *testing.B) {
switchFunc := func(v InterfaceA) {
switch v.Name() {
case "A":
v.(*A).Add()
case "B":
v.(*B).Add()
}
}
for i := 0; i < b.N; i++ {
v := new(A)
switchFunc(v)
}
}
func BenchmarkInterface2(b *testing.B) {
switchFunc := func(v interface{}) {
v.(InterfaceB).Add()
}
for i := 0; i < b.N; i++ {
v := new(A)
switchFunc(v)
}
}
func BenchmarkInterface3(b *testing.B) {
switchFunc := func(v InterfaceB) {
v.Add()
}
for i := 0; i < b.N; i++ {
v := new(A)
switchFunc(v)
}
}
func BenchmarkInterface4(b *testing.B) {
switchFunc := func(v InterfaceB) {
v.Name()
}
for i := 0; i < b.N; i++ {
v := new(A)
switchFunc(v)
}
}
func BenchmarkInterface5(b *testing.B) {
switchFunc := func(v InterfaceB) {
v.Name()
v.Add()
}
for i := 0; i < b.N; i++ {
v := new(A)
switchFunc(v)
}
}
测试结果:
└──╼ go test -test.bench=".*" . -benchmem
goos: darwin
goarch: amd64
pkg: org
cpu: Intel(R) Core(TM) i5-8279U CPU @ 2.40GHz
BenchmarkNormal-8 1000000000 0.2542 ns/op 0 B/op 0 allocs/op
BenchmarkInterface-8 1000000000 0.8415 ns/op 0 B/op 0 allocs/op
BenchmarkInterface1-8 72095432 15.48 ns/op 8 B/op 1 allocs/op
BenchmarkInterface2-8 55137806 21.07 ns/op 8 B/op 1 allocs/op
BenchmarkInterface3-8 799164643 1.449 ns/op 0 B/op 0 allocs/op
BenchmarkInterface4-8 767046265 1.519 ns/op 0 B/op 0 allocs/op
BenchmarkInterface5-8 72075118 15.82 ns/op 8 B/op 1 allocs/op
PASS
ok org 7.915s
还有就是 interface 接口单独测试 Name()或者 Add()性能都差不多,可一旦两个一起调用,性能几乎减少了 10 倍,有大佬研究过这个问题吗?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.