Перейти к содержимому
9 / 15

Бенчмарки в Go: b.Loop, benchstat и как не измерить шум

Бенчмарк — функция BenchmarkXxx(b *testing.B), тело которой рантайм выполняет столько раз, сколько нужно для устойчивого измерения. Современная форма — цикл for b.Loop(), появившийся в Go 1.24: он сам исключает подготовку из замера и, что важнее, не даёт компилятору выбросить вызов как ненужный, чего старый цикл по b.N не гарантировал. Флаг -benchmem добавляет к результату число байт и аллокаций на операцию — часто это полезнее наносекунд, потому что аллокации предсказуемы, а время шумит. Главная ошибка — доверять одному прогону: результат зависит от загрузки машины, частоты процессора и соседей по хосту. Правильный порядок — прогнать с -count=10 до и после изменения и сравнить через benchstat, который считает статистику и честно говорит, значима ли разница. Отдельная тонкость: измерять надо реалистичный вход, иначе оптимизируется сценарий, которого нет.