testing.B.ResetTimer în Go

Pune la zero timpul și alocările măsurate până acum, ca pregătirea costisitoare să nu intre în rezultat.

Sintaxă
func (b *B) ResetTimer()

Ce face testing.B.ResetTimer

În benchmark-urile cu bucla clasică for i := 0; i < b.N; i++, tot ce faci înaintea buclei (citirea unui fișier, generarea datelor) intră în timpul măsurat. b.ResetTimer(), apelat chiar înainte de buclă, șterge ce s-a măsurat până atunci.

Cu bucla modernă for b.Loop() nu mai ai nevoie de el: cronometrul pornește singur la prima iterație. Pentru a exclude o parte din interiorul buclei există b.StopTimer() și b.StartTimer().

Ce returnează

Nimic.

Exemple

Exemplul 1: Pregătire lentă, cu și fără ResetTimer

Ambele benchmark-uri au o pregătire de 200 ms. Fără ResetTimer, acest timp se împarte la numărul de iterații și umflă rezultatul.

// fișierul cautare_test.go
package magazin

import (
    "slices"
    "testing"
    "time"
)

func pregatesteCatalog() []int {
    time.Sleep(200 * time.Millisecond) // simulăm citirea catalogului din bază
    catalog := make([]int, 10_000)
    for i := range catalog {
        catalog[i] = i * 3
    }
    return catalog
}

func BenchmarkCautareFaraReset(b *testing.B) {
    catalog := pregatesteCatalog()
    for i := 0; i < b.N; i++ {
        slices.BinarySearch(catalog, 2997)
    }
}

func BenchmarkCautareCuReset(b *testing.B) {
    catalog := pregatesteCatalog()
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        slices.BinarySearch(catalog, 2997)
    }
}

Rezultatul în terminal, pe un Mac cu procesor Apple (numerele diferă de la un calculator la altul)

$ go test -bench=Cautare -benchtime=100x
goos: darwin
goarch: arm64
pkg: magazin
cpu: Apple M1 Pro
BenchmarkCautareFaraReset-10    	     100	   2010615 ns/op
BenchmarkCautareCuReset-10      	     100	        37.50 ns/op
PASS
ok  	magazin	1.056s

Greșeli frecvente

  • Pui ResetTimer în interiorul buclei. Măsurătoarea se strică; pentru pauze în buclă folosește StopTimer/StartTimer (sau mută pregătirea în afara buclei).

Comenzi înrudite

  • testing.B.Loop: Condiția buclei unui benchmark: returnează true cât timp mai trebuie repetat codul măsurat (Go 1.24).
  • testing.B: Tipul primit de funcțiile benchmark, care măsoară cât durează (și câtă memorie folosește) o bucată de cod.