Функция testing.AllocsPerRun

Функция testing.AllocsPerRun измеряет количество выделений памяти (аллокаций) при выполнении переданной функции. В первый параметр передается количество итераций запуска, во второй параметр - функция, которую нужно протестировать. Возвращает функция два значения: среднее количество аллокаций за один запуск и среднее время выполнения в наносекундах. Эта функция полезна для оптимизации производительности и отслеживания утечек памяти.

Синтаксис

gotesting.AllocsPerRun(n int, f func()) float64

Пример 1

Давайте измерим количество аллокаций при создании слайса с помощью функции make:

gopackage main

import (
  "fmt"
  "testing"
)

func main() {
  allocations := testing.AllocsPerRun(100, func() {
    slice := make([]int, 0, 10)
    _ = slice
  })
  fmt.Println("Allocations per run:", allocations)
}

Результат выполнения кода:

go"Allocations per run: 0"

Пример 2

Измерим количество аллокаций при добавлении элементов в слайс с помощью функции append:

gopackage main

import (
  "fmt"
  "testing"
)

func main() {
  allocations := testing.AllocsPerRun(100, func() {
    slice := []int{1, 2, 3}
    slice = append(slice, 4, 5)
    _ = slice
  })
  fmt.Println("Allocations per run:", allocations)
}

Результат выполнения кода:

go"Allocations per run: 1"

Пример 3

Сравним количество аллокаций при создании структуры через указатель и через значение:

gopackage main

import (
  "fmt"
  "testing"
)

type User struct {
  Name string
  Age  int
}

func main() {
  allocations := testing.AllocsPerRun(100, func() {
    user := &User{Name: "Alice", Age: 30}
    _ = user
  })
  fmt.Println("Allocs for pointer:", allocations)

  allocations = testing.AllocsPerRun(100, func() {
    user := User{Name: "Bob", Age: 25}
    _ = user
  })
  fmt.Println("Allocs for value:", allocations)
}

Результат выполнения кода:

go"Allocs for pointer: 1"
"Allocs for value: 0"

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

  • функцию testing.B.ReportAllocs,
    которая включает отчет об аллокациях в бенчмарках
  • структуру testing.B,
    которая используется для написания бенчмарков
  • структуру testing.T,
    которая используется для написания тестов
  • функцию testing.Coverage,
    которая возвращает процент покрытия кода тестами