Вот простой тест на тестирование Голанга, он запускает x++
тремя различными способами:
- в простом цикле for с объявленной внутри x функцией
- во вложенном циклес 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 раз медленнее).
И мне интересно, почему это происходит, есть ли способ улучшитьпроизводительность доступа к глобальным переменным?