Golang全局变量访问在基准测试中很慢

时间:2019-03-05 15:13:39

标签: go

这是一个简单的golang基准测试,它以三种不同的方式运行x++

  1. 在一个简单的for循环中,在函数内部声明了x
  2. 在带有在函数内部声明的x的嵌套循环中
  3. 在一个嵌套循环中,其中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倍)。

我不知道为什么会这样,有没有办法提高全局变量访问的性能?

1 个答案:

答案 0 :(得分:1)

  

我想知道为什么会这样。

编译器可以优化整个代码。每个操作300ps意味着仅“ noop”被执行。