概述
本文主要介绍闭包、channel和接口相关的性能开销
golang中提供了很多语法糖,但它们都有较复杂的实现方式,因此使用它们时需要小心,在对性能要求较高的场景尽量不要使用
匿名函数的性能开销
代码
import "testing"
func test(x int) int {
return x * 2
}
// 普通函数调用
func BenchmarkTest(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = test(i)
}
}
// 匿名函数调用
func BenchmarkAnomy(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = func(x int) int {
return x * 2
}(i)
}
}
// 闭包
func BenchmarkClosure(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = func() int {
return i * 2
}()
}
}
运行
% go test -v -bench . -benchmem
goos: darwin
goarch: amd64
BenchmarkTest
BenchmarkTest-8 1000000000 0.542 ns/op 0 B/op 0 allocs/op
BenchmarkAnomy
BenchmarkAnomy-8 1000000000 0.543 ns/op 0 B/op 0 allocs/op
BenchmarkClosure
BenchmarkClosure-8 830409748 1.44 ns/op 0 B/op 0 allocs/op