类型断言将涉及对 runtime.assertE2T 或 runtime.assertE2I 的调用(您可以看到汇编代码)。
package main
import (
"fmt"
"time"
)
type I interface {
echo()
}
type A struct{}
func (a *A) echo() {}
type testfn func()
func run(f testfn) {
ts := time.Now()
f()
te := time.Now()
fmt.Println(te.Sub(ts))
}
func testE2T() {
var i interface{} = new(A)
for a := 0; a < 500000000; a++ {
_ = i.(*A)
}
}
func testE2I() {
var i interface{} = new(A)
for a := 0; a < 500000000; a++ {
_ = i.(I)
}
}
func main() {
fmt.Println("testE2I:")
run(testE2I)
fmt.Println("testE2T:")
run(testE2T)
}
结果:
testE2I:
11.065225934s
testE2T:
5.720773381s
似乎类型断言比 C 中的指针转换慢?怎么解释?
而且奇怪的是,当我使用gccgo运行相同的程序时,会导致内存不足错误。gccgo 在 gc 中有一些限制吗?
慕标5832272
相关分类