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

标签 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 倍)。

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

最佳答案

I wonder why this is happening.

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

关于golang 全局变量访问在基准测试中很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55005956/

相关文章:

file - 戈朗 : write []int to file

go - Go 函数参数中下划线的含义

mysql - 带有 url 参数的 go chi 路由器和 mysql 数据库无法正常工作

go - 'thread pooling' 与 Go 相关吗?

go - 如何防止变量声明和发现错误

go - 如何找到覆盖特定Go代码的测试?

json - golang json如何解码不同元素数据类型的二维数组

curl - 使用 GoLang 通过curl 发送多部分请求

go - 我尝试测试用Go语言编写的代码,但始终收到此错误,并且不知道为什么

go - Go2从一种类型映射到另一种类型