Go Academy · Lekcja

Pisanie benchmarków za pomocą testing.B

BenchmarkXxx, pętla b.N i flaga -bench

Lekcja 1 z 413 kroki

Pisanie benchmarków za pomocą testing.B to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.

Sygnatura funkcji benchmarkowej

Benchmarki zaczynają się od Benchmark i przyjmują *testing.B. Są uruchamiane w pliku _test.go razem ze zwykłymi testami.

func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Add(2, 3)
    }
}

b.N

Framework testów automatycznie dostosowuje b.N — liczbę iteracji pętli — aż benchmark będzie działać co najmniej 1 sekundę, zapewniając stabilny wynik w nanosekundach na operację.

Uruchamianie benchmarków

Benchmarki nie są uruchamiane za pomocą samego go test. Proszę użyć -bench, aby je włączyć:

go test -bench=. -benchmem ./...
// BenchmarkAdd-8  500000000  2.13 ns/op  0 B/op  0 allocs/op

Flaga -benchmem

-benchmem dodaje statystyki alokacji: liczbę bajtów na operację oraz liczbę alokacji na operację. Duża liczba alokacji często wskazuje na problemy z wydajnością.

b.ResetTimer

Proszę wywołać b.ResetTimer() po kosztownej konfiguracji początkowej, która nie powinna być uwzględniana w benchmarku:

func BenchmarkQuery(b *testing.B) {
    db := setupDB() // expensive
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        db.Query("SELECT 1")
    }
}

b.StopTimer / b.StartTimer

Proszę wstrzymać i wznowić pomiar czasu wokół konfiguracji początkowej lub końcowej, która nie powinna wpływać na czas benchmarku.

for i := 0; i < b.N; i++ {
    b.StopTimer()
    data := generateInput()
    b.StartTimer()
    process(data)
}

b.SetBytes

Proszę wywołać b.SetBytes(n), aby oprócz czasu na operację raportować przepustowość (bajty/s). Jest to przydatne podczas benchmarkowania serializacji lub kodu sieciowego.

b.SetBytes(int64(len(payload)))
for i := 0; i < b.N; i++ {
    encode(payload)
}

Porównywanie benchmarków

Proszę użyć benchstat, aby porównać dwa uruchomienia benchmarku i zobaczyć statystycznie istotne różnice:

go test -bench=. -count=10 > before.txt
# make change
go test -bench=. -count=10 > after.txt
benchstat before.txt after.txt

Zapobieganie eliminacji martwego kodu

Proszę przypisać wynik do zmiennej na poziomie pakietu lub do zmiennej typu sink, aby zapobiec usunięciu przez kompilator kodu poddawanego benchmarkowi:

var result int
func BenchmarkFib(b *testing.B) {
    for i := 0; i < b.N; i++ {
        result = Fib(20)
    }
}

Podbenchmarki

Proszę użyć b.Run, aby utworzyć nazwane podbenchmarki, podobnie jak w testach sterowanych tabelą:

for _, size := range []int{10, 100, 1000} {
    b.Run(fmt.Sprintf("size=%d", size), func(b *testing.B) {
        for i := 0; i < b.N; i++ { sort(make([]int, size)) }
    })
}

Benchmark a profilowanie

Benchmarki mierzą wydajność. Profilowanie (pprof) pokazuje, gdzie zużywany jest czas. Proszę używać benchmarków do pomiaru, a profilowania do diagnozowania miejsc wymagających optymalizacji.

Szybkie sprawdzenie

Dlaczego treść pętli benchmarku musi wykorzystywać wynik, aby zapobiec optymalizacji przez kompilator?

Podsumowanie: benchmarki

Najważniejsze informacje:

  • BenchmarkXxx(b *testing.B) z pętlą for i := 0; i < b.N; i++
  • go test -bench=. -benchmem dla statystyk alokacji
  • b.ResetTimer() po kosztownej konfiguracji początkowej
  • Proszę używać benchstat do porównywania uruchomień i przypisywać wyniki, aby zapobiec eliminacji kodu
Bezpłatny start

Ucz się Go dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
51
Lekcje
203

Często zadawane pytania

Czy lekcja „Pisanie benchmarków za pomocą testing.B” jest bezpłatna?

Tak — pełny tekst „Pisanie benchmarków za pomocą testing.B” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Pisanie benchmarków za pomocą testing.B”?

BenchmarkXxx, pętla b.N i flaga -bench Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Go Academy?

Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Pisanie benchmarków za pomocą testing.B”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?

Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Pisanie benchmarków za pomocą testing.B
  2. Profilowanie procesora za pomocą pprof
  3. Profilowanie sterty i alokacji
  4. Śledzenie wykonania
← Powrót do Go Academy