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șteStopTimer/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.