Метод testing.B.ReportAllocs
Метод ReportAllocs типа testing.B включает
вывод статистики по выделениям памяти в отчете бенчмарка.
Он не принимает параметров и не возвращает значений.
После вызова этого метода в бенчмарке, при его запуске
с флагом -benchmem, в выводе будут отображаться
количество выделений и общий объем выделенной памяти
на одну итерацию.
Синтаксис
b.ReportAllocs()
Пример
Давайте рассмотрим бенчмарк для функции, которая
создает слайс строк. Включим отчет по выделениям
с помощью ReportAllocs:
package 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:
"BenchmarkMakeSlice-8 1000000 1234 ns/op 80 B/op 1 allocs/op"
В выводе видно, что на одну операцию выделяется 80 байт и происходит 1 выделение памяти (allocs/op).
Пример
Рассмотрим бенчмарк без вызова ReportAllocs.
Статистика по памяти не будет отображаться в отчете,
даже если указан флаг -benchmem:
package 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:
"BenchmarkMakeMap-8 500000 3456 ns/op"
В выводе отсутствует информация о выделениях памяти,
так как метод ReportAllocs не был вызван.
Пример
Метод ReportAllocs можно вызывать в любом месте
бенчмарка, но рекомендуется делать это в начале
функции для единообразия:
package 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:
"BenchmarkConcatStrings-8 30000 45678 ns/op 10000 B/op 100 allocs/op"
Теперь в отчете отображается количество выделений и объем памяти на одну операцию, что позволяет оценить эффективность использования памяти.
Смотрите также
-
метод
testing.B.ResetTimer,
который сбрасывает таймер бенчмарка -
метод
testing.B.StartTimer,
который запускает таймер бенчмарка -
метод
testing.B.StopTimer,
который останавливает таймер бенчмарка -
функцию
testing.AllocsPerRun,
которая измеряет количество выделений памяти за выполнение функции