3 回答
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倍慢的类型切换,并且不会减慢类型断言(有或没有检查)。
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
类型断言现在要快得多,但最有趣的是删除类型检查使它变慢。
- 3 回答
- 0 关注
- 317 浏览
添加回答
举报