这是一个简单的golang基准测试,它运行
x++
有三种不同的方式:
-
在函数内部声明x的简单for循环中
-
在函数内部声明x的嵌套循环中
-
在x声明为的嵌套循环中
全局变量
package main
import (
"testing"
)
var x = 0
func BenchmarkLoop(b *testing.B) {
x := 0
for n := 0; n < b.N; n++ {
x++
}
}
func BenchmarkDoubleLoop(b *testing.B) {
x := 0
for n := 0; n < b.N/1000; n++ {
for m := 0; m < 1000; m++ {
x++
}
}
}
func BenchmarkDoubleLoopGlobalVariable(b *testing.B) {
for n := 0; n < b.N/1000; n++ {
for m := 0; m < 1000; m++ {
x++
}
}
}
结果如下:
$ go test -bench=.
BenchmarkLoop-8 2000000000 0.32 ns/op
BenchmarkDoubleLoop-8 2000000000 0.34 ns/op
BenchmarkDoubleLoopGlobalVariable-8 2000000000 2.00 ns/op
PASS
ok github.com/cizixs/playground/loop-perf 5.597s
显然,第一个和第二个方法具有相似的性能,而第三个函数则慢得多(大约慢了6倍)。
我想知道为什么会这样,有没有办法提高全局变量访问的性能?