Поле testing.B.N

Поле N структуры testing.B задает количество итераций, которые будет выполнены в бенчмарке. Это поле устанавливается фреймворком автоматически перед запуском бенчмарка на основе времени выполнения каждой итерации и значения флага -benchtime. Внутри бенчмарка поле N используется для цикла, который выполняет измеряемый код.

Синтаксис

gob.N

Поле N имеет тип int и доступно только для чтения. Оно используется внутри бенчмарк-функций для управления количеством повторений измеряемого кода.

Пример

Давайте создадим простой бенчмарк, который измеряет время выполнения операции сложения:

gopackage main

import (
  "fmt"
  "testing"
)

func BenchmarkAddition(b *testing.B) {
  for i := 0; i < b.N; i++ {
    _ = 1 + 1
  }
}

func main() {
  br := testing.Benchmark(BenchmarkAddition)
  fmt.Printf("N: %d\n", br.N)
  fmt.Printf("Time per op: %s\n", br.T)
}

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

go"N: 1000000000"
"Time per op: 285.5 ns/op"

Пример

Бенчмарк для проверки конкатенации строк с использованием поля N для управления итерациями:

gopackage main

import (
  "fmt"
  "testing"
)

func BenchmarkConcat(b *testing.B) {
  for i := 0; i < b.N; i++ {
    s := "Hello" + "World"
    _ = s
  }
}

func main() {
  res := testing.Benchmark(BenchmarkConcat)
  fmt.Printf("N: %d\n", res.N)
  fmt.Printf("Time per op: %s\n", res.T)
}

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

go"N: 1000000000"
"Time per op: 267.1 ns/op"

Пример

Более сложный пример с функцией, которая использует поле N для перебора элементов слайса:

gopackage main

import (
  "fmt"
  "testing"
)

func sumSlice(s []int) int {
  total := 0
  for _, v := range s {
    total += v
  }
  return total
}

func BenchmarkSumSlice(b *testing.B) {
  data := []int{1, 2, 3, 4, 5}
  for i := 0; i < b.N; i++ {
    _ = sumSlice(data)
  }
}

func main() {
  res := testing.Benchmark(BenchmarkSumSlice)
  fmt.Printf("N: %d\n", res.N)
  fmt.Printf("Time per op: %s\n", res.T)
}

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

go"N: 50308672"
"Time per op: 31.54 ns/op"

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

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