这是一个简单的golang基准测试,它以三种不同的方式运行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倍)。
我不知道为什么会这样,有没有办法提高全局变量访问的性能?
答案 0 :(得分:1)
我想知道为什么会这样。
编译器可以优化整个代码。每个操作300ps意味着仅“ noop”被执行。