除此之外,一些代码生成和一些优化比其他更容易完成。有关详细信息,请参阅go gc编译器源代码。
$ go version
go version devel +e68ac45172 Fri Jul 20 16:04:01 2018 +0000 linux/amd64
未优化:
$ go test bench_test.go -bench=. -benchmem -gcflags='-N'
goos: linux
goarch: amd64
BenchmarkClosure-4 1 2621664326 ns/op 0 B/op 0 allocs/op
BenchmarkAnonymous-4 1 1995507678 ns/op 0 B/op 0 allocs/op
BenchmarkFunction-4 1 2297303813 ns/op 0 B/op 0 allocs/op
优化:
$ go test bench_test.go -bench=. -benchmem
goos: linux
goarch: amd64
BenchmarkClosure-4 2 585091582 ns/op 0 B/op 0 allocs/op
BenchmarkAnonymous-4 5 287299925 ns/op 0 B/op 0 allocs/op
BenchmarkFunction-4 5 287710165 ns/op 0 B/op 0 allocs/op
bench_test.go
:
package main
import "testing"
func X(p *int) {
*p += 1
}
var N = 1000000000
func BenchmarkClosure(b *testing.B) {
for n := 0; n < b.N; n++ {
for i := 0; i < N; i++ {
p := 0
x := func() {
p += 1
}
x()
}
}
}
func BenchmarkAnonymous(b *testing.B) {
for n := 0; n < b.N; n++ {
for i := 0; i < N; i++ {
p := 0
func() {
p += 1
}()
}
}
}
func BenchmarkFunction(b *testing.B) {
for n := 0; n < b.N; n++ {
for i := 0; i < N; i++ {
p := 0
X(&p)
}
}
}