Метод testing.B.StopTimer
Метод testing.B.StopTimer останавливает таймер бенчмарка,
зафиксировав текущее время выполнения. Он применяется,
когда необходимо исключить время на подготовительные операции
(например, создание тестовых данных, инициализацию структур,
чтение файлов) из общего времени бенчмарка. Это позволяет
получить более точные измерения производительности
целевого кода.
Синтаксис
b.StopTimer()
Пример
Давайте измерим время выполнения операции с исключением времени на подготовку данных:
package main
import (
"testing"
)
func BenchmarkProcess(b *testing.B) {
// Останавливаем таймер для подготовки данных
b.StopTimer()
// Подготовка тестовых данных
data := make([]int, 1000)
for i := range data {
data[i] = i
}
// Запускаем таймер перед основным циклом
b.StartTimer()
for i := 0; i < b.N; i++ {
processData(data)
}
}
func processData(data []int) int {
sum := 0
for _, v := range data {
sum += v
}
return sum
}
Результат выполнения бенчмарка:
"BenchmarkProcess-8 12345 98765 ns/op"
Пример
Рассмотрим пример с чтением файла, где время на открытие и загрузку данных исключается из измерений:
package main
import (
"os"
"testing"
)
func BenchmarkFileParsing(b *testing.B) {
b.StopTimer()
// Чтение файла перед бенчмарком
content, err := os.ReadFile("testdata/largefile.txt")
if err != nil {
b.Fatal(err)
}
b.StartTimer()
for i := 0; i < b.N; i++ {
parseContent(content)
}
}
func parseContent(content []byte) int {
// Парсинг данных
return len(content)
}
Результат выполнения бенчмарка:
"BenchmarkFileParsing-8 2345 123456 ns/op"
Пример
Пример использования StopTimer для исключения времени
на создание сложных структур данных:
package main
import (
"testing"
)
type User struct {
ID int
Name string
Email string
}
func BenchmarkUserProcessing(b *testing.B) {
b.StopTimer()
// Создание тестовых пользователей
users := make([]User, 100)
for i := range users {
users[i] = User{
ID: i,
Name: "User",
Email: "user@example.com",
}
}
b.StartTimer()
for i := 0; i < b.N; i++ {
processUsers(users)
}
}
func processUsers(users []User) int {
total := 0
for _, u := range users {
total += u.ID
}
return total
}
Результат выполнения бенчмарка:
"BenchmarkUserProcessing-8 4567 87654 ns/op"
Смотрите также
-
метод
testing.B.StartTimer,
который запускает таймер бенчмарка -
метод
testing.B.ResetTimer,
который сбрасывает таймер бенчмарка -
структуру
testing.B,
которая представляет бенчмарк в Go -
метод
testing.B.ReportAllocs,
который включает отчет об аллокациях памяти