代码之家  ›  专栏  ›  技术社区  ›  cizixs

golang全局变量访问在基准测试中速度慢

go
  •  -1
  • cizixs  · 技术社区  · 7 年前

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

    1. 在函数内部声明x的简单for循环中
    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倍)。

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

    0 回复  |  直到 7 年前
        1
  •  1
  •   Volker    7 年前

    我想知道为什么会这样。

    编译器优化了整个代码。每次操作300ps意味着只有一个noop被“执行”。