【发布时间】:2015-04-11 19:57:24
【问题描述】:
我目前正在玩 go,它是汇编、浮点运算的性能 (float32) 和纳秒级的优化。一个简单的函数调用的开销让我有点困惑:
func BenchmarkEmpty(b *testing.B) {
for i := 0; i < b.N; i++ {
}
}
func BenchmarkNop(b *testing.B) {
for i := 0; i < b.N; i++ {
doNop()
}
}
doNop的实现:
TEXT ·doNop(SB),0,$0-0
RET
结果(go test -bench .):
BenchmarkEmpty 2000000000 0.30 ns/op
BenchmarkNop 2000000000 1.73 ns/op
我不习惯 Go 的组装和/或内部结构。 go 编译器/链接器可以内联程序集中定义的函数吗?我可以以某种方式给链接器一个提示吗?对于一些简单的函数,比如“添加两个 R3 向量”,这会消耗所有可能的性能提升。
(转到 1.4.2,amd64)
【问题讨论】:
-
你确定 Go 不只是优化 BenchmarkEmpty() 中的循环吗?如果是这样,将 BenchmarkEmpty 与 BenchmarkNop 进行比较就不算什么了。
-
是的,我确定。我已经查看了反汇编,并且循环仍然存在。顺便说一句,doNop (
func doNopGeneric(){}) 的通用实现已被优化掉。
标签: performance optimization assembly go