go - golang全局变量访问在基准测试中很慢
问题描述
这是一个简单的 golang 基准测试,它x++
以三种不同的方式运行:
- 在函数内部声明 x 的简单 for 循环中
- 在函数内部声明 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 倍)。
我想知道为什么会这样,有没有办法提高全局变量访问的性能?
解决方案
我想知道为什么会这样。
编译器优化了你的整个代码。每个操作 300ps 意味着只有一个 noop 被“执行”。
推荐阅读
- c++ - 阻止 cin 继续接受输入
- dialogflow-es - LocationPermission 上下文中的 SSML
- linux - 创建可以导入变量并针对来自外部文本文件的变量执行代码的 bash 脚本
- angular - 覆盖离子4中的工具栏后退按钮操作
- splunk - 带有 where 子句的 Splunk 搜索查询不起作用
- excel - 如何使用 LDAP 从 excel VBA 连接到 Oracle 数据库?
- r - bookdown::html_document2 中数据框分页打印的表格标题
- angular - 更改事件未在角度 6 中触发
- laravel - 如何在 laravel Echo 中获取连接状态/其他事件
- r - ggplot2中带有阴影置信区间的平均线图