Метод testing.B.ReportAllocs

Метод ReportAllocs типа testing.B включает вывод статистики по выделениям памяти в отчете бенчмарка. Он не принимает параметров и не возвращает значений. После вызова этого метода в бенчмарке, при его запуске с флагом -benchmem, в выводе будут отображаться количество выделений и общий объем выделенной памяти на одну итерацию.

Синтаксис

gob.ReportAllocs()

Пример

Давайте рассмотрим бенчмарк для функции, которая создает слайс строк. Включим отчет по выделениям с помощью ReportAllocs:

gopackage main

import (
  "testing"
)

func makeSlice() []string {
  s := make([]string, 0, 10)
  for i := 0; i < 10; i++ {
    s = append(s, "test")
  }
  return s
}

func BenchmarkMakeSlice(b *testing.B) {
  b.ReportAllocs()
  for i := 0; i < b.N; i++ {
    makeSlice()
  }
}

Результат выполнения бенчмарка с флагом -benchmem:

go"BenchmarkMakeSlice-8  1000000  1234 ns/op  80 B/op  1 allocs/op"

В выводе видно, что на одну операцию выделяется 80 байт и происходит 1 выделение памяти (allocs/op).

Пример

Рассмотрим бенчмарк без вызова ReportAllocs. Статистика по памяти не будет отображаться в отчете, даже если указан флаг -benchmem:

gopackage main

import (
  "testing"
)

func makeMap() map[int]string {
  m := make(map[int]string)
  for i := 0; i < 10; i++ {
    m[i] = "value"
  }
  return m
}

func BenchmarkMakeMap(b *testing.B) {
  for i := 0; i < b.N; i++ {
    makeMap()
  }
}

Результат выполнения бенчмарка с флагом -benchmem:

go"BenchmarkMakeMap-8  500000  3456 ns/op"

В выводе отсутствует информация о выделениях памяти, так как метод ReportAllocs не был вызван.

Пример

Метод ReportAllocs можно вызывать в любом месте бенчмарка, но рекомендуется делать это в начале функции для единообразия:

gopackage main

import (
  "testing"
)

func concatStrings() string {
  s := ""
  for i := 0; i < 100; i++ {
    s += "a"
  }
  return s
}

func BenchmarkConcatStrings(b *testing.B) {
  b.ReportAllocs()
  for i := 0; i < b.N; i++ {
    concatStrings()
  }
}

Результат выполнения бенчмарка с флагом -benchmem:

go"BenchmarkConcatStrings-8  30000  45678 ns/op  10000 B/op  100 allocs/op"

Теперь в отчете отображается количество выделений и объем памяти на одну операцию, что позволяет оценить эффективность использования памяти.

Смотрите также

  • метод testing.B.ResetTimer,
    который сбрасывает таймер бенчмарка
  • метод testing.B.StartTimer,
    который запускает таймер бенчмарка
  • метод testing.B.StopTimer,
    который останавливает таймер бенчмарка
  • функцию testing.AllocsPerRun,
    которая измеряет количество выделений памяти за выполнение функции