Материал проходит вычитку — возможны неточности.
Урок 25 из 118

Чтение результатов

Первый бенчмарк валидации был готов, и Миша читал его строку вместе с Аней: три числа отвечали на разные вопросы. Сравнение вариантов на одной машине показало: аллокации часто важнее наносекунд.

Главная мысль

в строке бенчмарка три числа — ns/op, B/op и allocs/op; для кода, который дёргает GC, аллокации часто важнее времени.

Строка результата

BenchmarkValidateEmails-8    500000    2450 ns/op    512 B/op    2 allocs/op
  • -8 — значение GOMAXPROCS (число P); обычно совпадает с числом ядер, но в контейнере с ограниченным CPU может быть меньше.
  • 500000 — сколько раз функция отработала.
  • ns/op — наносекунд на операцию.
  • B/op — байтов аллокаций на операцию.
  • allocs/op — число аллокаций на операцию.

B/op и allocs/op считают только аллокации в куче: стековые в замер не входят, поэтому трактовать B/op как полный объём памяти операции нельзя.

Для кода, который дёргает GC, allocs/op часто важнее времени: меньше аллокаций — меньше работы сборщика (связь с), даже если наносекунды почти не изменились.

Сравнение на одной машине

Бенчмарк измеряет относительную скорость, а не абсолютную. Цифры ns/op имеют смысл только при сравнении двух вариантов на одной машине. Гоняешь бенчмарк, меняешь реализацию, гоняешь снова — разница и есть ответ. Переносить числа между машинами бессмысленно.

Классическое сравнение

Классика из конкурентных задач — счётчик на мьютексе, атомике и канале: три бенчмарка, одинаковый вход, разная синхронизация. Сравнение покажет то, о чём говорил: для простого инкремента мьютекс избыточен, атомик заметно дешевле, а канал — ещё дороже, потому что его операции чаще паркуют горутины через планировщик (правда, отправка в буфер со свободным местом может пройти и без парковки).

В следующем уроке

Вы узнаете:

  • как -benchtime и -count отсекают выбросы
  • почему -8 и как число ядер влияет
Задание · вопросы

Проверьте себя

Вопрос 1 из 3

Что означают ns/op, B/op и allocs/op?

Вопрос 2 из 3

Можно ли переносить ns/op между разными машинами?

Вопрос 3 из 3

Для кода, который дёргает GC, что часто важнее времени?

Итоги

ns/op — время, B/op и allocs/op — аллокации в куче. Сравнивай на одной машине; для GC-чувствительного кода смотри allocs/op.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки