为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中,类型断言/类型切换是否性能不佳/速度慢?

在 Go 中,类型断言/类型切换是否性能不佳/速度慢?

Go
HUH函数 2021-09-10 21:48:41
在 Go 中使用类型断言/类型切换作为运行时类型发现的方法有多慢?例如,我听说在 C/C++ 中,在运行时发现类型的性能很差。为了绕过这一点,您通常向类添加类型成员,这样您就可以与这些成员进行比较而不是强制转换。我还没有在整个 www 中找到明确的答案。这是我要问的一个例子 -与其他类型检查方法(如上面提到的或我不知道的其他方法)相比,这被认为是快速的吗?func question(anything interface{}) {    switch v := anything.(type) {        case string:            fmt.Println(v)        case int32, int64:            fmt.Println(v)        case SomeCustomType:            fmt.Println(v)        default:            fmt.Println("unknown")    }}
查看完整描述

3 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

我想自己验证siritinga的答案,并检查删除TypeAssertion中的检查是否会使其更快。我在他们的基准测试中添加了以下内容:


func incnAssertionNoCheck(any Inccer, n int) {

    for k := 0; k < n; k++ {

        any.(*myint).inc()

    }

}


func BenchmarkTypeAssertionNoCheck(b *testing.B) {

    i := new(myint)

    incnAssertionNoCheck(i, b.N)

}

并在我的机器上重新运行基准测试。


BenchmarkIntmethod-12               2000000000           1.77 ns/op

BenchmarkInterface-12               1000000000           2.30 ns/op

BenchmarkTypeSwitch-12              500000000            3.76 ns/op

BenchmarkTypeAssertion-12           2000000000           1.73 ns/op

BenchmarkTypeAssertionNoCheck-12    2000000000           1.72 ns/op

如此看来,做一个类型开关的成本下降显著从围棋1.4(我假设siritinga使用)去1.6(我使用):从5-6次慢小于2倍慢的类型切换,并且不会减慢类型断言(有或没有检查)。


查看完整回答
反对 回复 2021-09-10
?
茅侃侃

TA贡献1842条经验 获得超21个赞

我使用 Go 1.9 的结果


BenchmarkIntmethod-4                1000000000           2.42 ns/op

BenchmarkInterface-4                1000000000           2.84 ns/op

BenchmarkTypeSwitch-4               1000000000           2.29 ns/op

BenchmarkTypeAssertion-4            1000000000           2.14 ns/op

BenchmarkTypeAssertionNoCheck-4     1000000000           2.34 ns/op

类型断言现在要快得多,但最有趣的是删除类型检查使它变慢。


查看完整回答
反对 回复 2021-09-10
  • 3 回答
  • 0 关注
  • 317 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信