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

在 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")

    }

}


HUH函数
浏览 318回答 3
3回答

慕桂英3389331

我想自己验证siritinga的答案,并检查删除TypeAssertion中的检查是否会使其更快。我在他们的基准测试中添加了以下内容:func incnAssertionNoCheck(any Inccer, n int) {&nbsp; &nbsp; for k := 0; k < n; k++ {&nbsp; &nbsp; &nbsp; &nbsp; any.(*myint).inc()&nbsp; &nbsp; }}func BenchmarkTypeAssertionNoCheck(b *testing.B) {&nbsp; &nbsp; i := new(myint)&nbsp; &nbsp; incnAssertionNoCheck(i, b.N)}并在我的机器上重新运行基准测试。BenchmarkIntmethod-12&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2000000000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1.77 ns/opBenchmarkInterface-12&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1000000000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2.30 ns/opBenchmarkTypeSwitch-12&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 500000000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3.76 ns/opBenchmarkTypeAssertion-12&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2000000000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1.73 ns/opBenchmarkTypeAssertionNoCheck-12&nbsp; &nbsp; 2000000000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1.72 ns/op如此看来,做一个类型开关的成本下降显著从围棋1.4(我假设siritinga使用)去1.6(我使用):从5-6次慢小于2倍慢的类型切换,并且不会减慢类型断言(有或没有检查)。

茅侃侃

我使用 Go 1.9 的结果BenchmarkIntmethod-4&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1000000000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2.42 ns/opBenchmarkInterface-4&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1000000000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2.84 ns/opBenchmarkTypeSwitch-4&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1000000000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2.29 ns/opBenchmarkTypeAssertion-4&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1000000000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2.14 ns/opBenchmarkTypeAssertionNoCheck-4&nbsp; &nbsp; &nbsp;1000000000&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2.34 ns/op类型断言现在要快得多,但最有趣的是删除类型检查使它变慢。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go