Go语言 类型断言性能测试

abv123456789 · · 4844 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

转载自达达的博客

在一些通用化的接口设计中,我们不得不用interface{}来代表任意类型,然后在接口内部用类型转换来判断具体类型,从而执行具体逻辑。但是类型判断是有性能代价的,如果能具像化的知道这个性能代价有多大,就可以帮助我们设计接口的时候判断应该怎么设计。

下面是实验代码(github):

package labs01

import "testing"

type InterfaceA interface {
    AA()
}

type InterfaceB interface {
    BB()
}

type A struct {
    v int
}

func (a *A) AA() {
    a.v += 1
}

type B struct {
    v int
}

func (b *B) BB() {
    b.v += 1
}

func TypeSwitch(v interface{}) {
    switch v.(type) {
    case InterfaceA:
        v.(InterfaceA).AA()
    case InterfaceB:
        v.(InterfaceB).BB()
    }
}

func NormalSwitch(a *A) {
    a.AA()
}

func InterfaceSwitch(v interface{}) {
    v.(InterfaceA).AA()
}

func Benchmark_TypeSwitch(b *testing.B) {
    var a = new(A)

    for i := 0; i < b.N; i++ {
        TypeSwitch(a)
    }
}

func Benchmark_NormalSwitch(b *testing.B) {
    var a = new(A)

    for i := 0; i < b.N; i++ {
        NormalSwitch(a)
    }
}

func Benchmark_InterfaceSwitch(b *testing.B) {
    var a = new(A)

    for i := 0; i < b.N; i++ {
        InterfaceSwitch(a)
    }
}

执行结果:

dada-imac:misc dada$ go test -test.bench=".*" labs01
testing: warning: no tests to run
PASS
Benchmark_TypeSwitch         50000000            33.0 ns/op
Benchmark_NormalSwitch       2000000000          1.99 ns/op
Benchmark_InterfaceSwitch    100000000           18.4 ns/op
ok      labs    7.741s

结论:类型判断和类型转换这两个操作都比直接操作多几倍的消耗。



有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:abv123456789

查看原文:Go语言 类型断言性能测试

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4844 次点击  
加入收藏 微博
被以下专栏收入,发现更多相似内容
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传