Доступ к глобальной переменной в golang медленный в тесте производительности - PullRequest
0 голосов
/ 05 марта 2019

Вот простой тест на тестирование Голанга, он запускает 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 Ответ

1 голос
/ 05 марта 2019

Интересно, почему это происходит?

Компилятор оптимизирует весь ваш код. 300ps за операцию означает, что только noop был "выполнен".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...