Всем привет. Понадобилось мне как то посчитать производительность сервера. И поставили задачу вычислить минимальное, максимальное, и среднее время на обработку запроса.

Короче я делал, делал и не мог понять, почему на холостом ходу микросекунды, а на тесте какие то странные цифры.

Начал исследовать причину. И я ее нашел. И теперь задаюсь вопросом: или лыжи не едут или в go баг?

count := 100000
wg := sync.WaitGroup{}
wg.Add(count)

dur2 := atomic.Int64{}

at := time.Now()

for i := 0; i < count; i++ {
    go func() {
        defer wg.Done()

        at2 := time.Now()
        for k := 0; k < 1000000; k++ {
        }

        dur2.Add(int64(time.Since(at2)))
    }()
}

wg.Wait()

durOne := time.Since(at) / time.Duration(count)
durGo := time.Duration(dur2.Load() / int64(count))

log.Println("Duration parallel: one ", durOne.String(), " goroutine ", durGo.String())

результат:

2024/10/30 20:34:35 Duration parallel: one 35.319µs goroutine 1.096925ms

go version go1.23.1 windows/amd64
goos: windows
goarch: amd64
cpu: 12th Gen Intel(R) Core(TM) i7-1255U


Баг проявляется и на винде и на linux

Напишите в комментариях, сталкивались ли Вы с таким багом и что вы думаете по этому поводу

Комментарии (0)