Pisanie benchmarków za pomocą testing.B
BenchmarkXxx, pętla b.N i flaga -bench
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/opFlaga -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.txtZapobieganie 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
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
- Pisanie benchmarków za pomocą testing.B
- Profilowanie procesora za pomocą pprof
- Profilowanie sterty i alokacji
- Śledzenie wykonania