Benchmarks mit testing.B schreiben
BenchmarkXxx, die b.N-Schleife und das Flag -bench
Benchmarks mit testing.B schreiben ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Signatur einer Benchmarkfunktion
Benchmarks beginnen mit Benchmark und verwenden *testing.B. Sie werden in der Datei _test.go neben regulären Tests ausgeführt.
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(2, 3)
}
}b.N
Das Testframework passt b.N automatisch an – die Anzahl der Schleifendurchläufe –, bis die Benchmark mindestens 1 Sekunde läuft und eine stabile Angabe in Nanosekunden pro Operation liefert.
Benchmarks ausführen
Benchmarks werden nicht allein mit go test ausgeführt. Verwenden Sie -bench, um sie zu aktivieren:
go test -bench=. -benchmem ./...
// BenchmarkAdd-8 500000000 2.13 ns/op 0 B/op 0 allocs/opFlag -benchmem
-benchmem fügt Allokationsstatistiken hinzu: Bytes pro Operation und die Anzahl der Allokationen pro Operation. Viele Allokationen weisen häufig auf Performanceprobleme hin.
b.ResetTimer
Rufen Sie b.ResetTimer() nach einem aufwendigen Setup auf, das nicht in der Benchmark berücksichtigt werden soll:
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
Pausieren Sie den Timer während Setup und Teardown, die nicht in die Benchmarkzeit einfließen sollen, und setzen Sie ihn anschließend fort.
for i := 0; i < b.N; i++ {
b.StopTimer()
data := generateInput()
b.StartTimer()
process(data)
}b.SetBytes
Rufen Sie b.SetBytes(n) auf, um zusätzlich zu time/op den Durchsatz (Bytes/Sekunde) auszugeben. Das ist beim Benchmarking von Serialisierungs- oder Netzwerkcode hilfreich.
b.SetBytes(int64(len(payload)))
for i := 0; i < b.N; i++ {
encode(payload)
}Benchmarks vergleichen
Verwenden Sie benchstat, um zwei Benchmarkläufe zu vergleichen und statistisch signifikante Unterschiede zu erkennen:
go test -bench=. -count=10 > before.txt
# make change
go test -bench=. -count=10 > after.txt
benchstat before.txt after.txtEliminierung toten Codes verhindern
Weisen Sie das Ergebnis einer Variablen auf Paketebene oder einem Sink zu, um zu verhindern, dass der Compiler den benchmarkten Code wegoptimiert:
var result int
func BenchmarkFib(b *testing.B) {
for i := 0; i < b.N; i++ {
result = Fib(20)
}
}Unterbenchmarks
Verwenden Sie b.Run, um benannte Unterbenchmarks zu erstellen, ähnlich wie bei tabellengesteuerten Tests:
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)) }
})
}Benchmarking und Profiling im Vergleich
Benchmarks quantifizieren die Performance. Profiling (pprof) zeigt, wo Zeit verbraucht wird. Verwenden Sie Benchmarks zum Messen und Profiling, um zu ermitteln, wo optimiert werden sollte.
Kurze Überprüfung
Warum muss der Schleifenkörper der Benchmark das Ergebnis verwenden, um eine Optimierung durch den Compiler zu verhindern?
Zusammenfassung: Benchmarks
Wichtige Punkte:
- BenchmarkXxx(b *testing.B) mit for i := 0; i < b.N; i++
- go test -bench=. -benchmem für Allokationsstatistiken
- b.ResetTimer() nach einem aufwendigen Setup
- Verwenden Sie benchstat zum Vergleichen von Läufen; weisen Sie Ergebnisse zu, um ihre Eliminierung zu verhindern
Lerne Go mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 51
- Lektionen
- 203
Häufig gestellte Fragen
Ist die Lektion „Benchmarks mit testing.B schreiben“ kostenlos?
Ja — der vollständige Text von „Benchmarks mit testing.B schreiben“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Benchmarks mit testing.B schreiben“?
BenchmarkXxx, die b.N-Schleife und das Flag -bench Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Go Academy zu starten?
Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Benchmarks mit testing.B schreiben“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?
Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Benchmarks mit testing.B schreiben
- CPU-Profiling mit pprof
- Heap- und Allokations-Profiling
- Ausführungstracing