这是一个简单的 golang 基准测试,它以三种不同的方式运行 x++
:
- 在一个简单的 for 循环中,在函数内部声明了 x
- 在函数内部声明了 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 倍)。
我想知道为什么会这样,有没有办法提高全局变量访问的性能?
最佳答案
I wonder why this is happening.
编译器会优化您的整个代码。每个操作 300ps 意味着只有一个 noop 被“执行”。
关于golang 全局变量访问在基准测试中很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55005956/