Ana içeriğe geç
Modül 9 · Ders 3 ders 5Kurstaki 43/50~12 min
Modül dersleri (3/5)

Karşılaştırmalar ve profiller

İşlevsel testlere ek olarak go test aynı zamanda yerleşik kıyaslamalara (BenchmarkXxx) sahiptir ve CPU ve bellek profillerini (pprof) destekler. Hepsi dışa bağımlılık olmadan.

Bir kıyaslama şekli

Go
func BenchmarkSum(b *testing.B) {
    for i := 0; i < b.N; i++ {
        _ = Sum(2, 3)
    }
}

Özellikler:

  • Tam imza: func BenchmarkXxx(b *testing.B).
  • Döngü b.N yinelemeleri çalıştırmalıdır: çerçeve, b.N'yi otomatik olarak ayarlar, 1'den başlar ve ölçüm stabil hale gelene kadar büyür (varsayılan olarak ~1 saniye).
  • Sonuç ns/op (işlem başına nanosaniye) ve -benchmem ile ayrıca B/op ve allocs/op olur.

Tipik komutlar

Bash
go test -bench=. ./...              # all benchmarks
go test -bench=Sum -benchmem        # only Sum, with memory info
go test -bench=. -benchtime=5s      # each benchmark for 5 seconds
go test -bench=. -cpuprofile=cpu.out # generate a CPU profile

Tipik çıktı:

Code
BenchmarkSum-8        1000000000        0.31 ns/op

-8, GOMAXPROCS değeridir. 0.31 ns/op çağrı başına ortalama süredir.

Pahalı kurulum: b.ResetTimer

Döngüden önce uzun bir hazırlık adımınız varsa, bunu ölçümden hariç tutun:

Go
func BenchmarkSearch(b *testing.B) {
    data := buildLargeSlice(1_000_000) // expensive
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        _ = Search(data, 42)
    }
}

Faydalı çeşitler:

  • b.StopTimer() / b.StartTimer() — ilgi çekici olmayan bir aşamada ölçümü duraklatın (döngü içinde kullanışlıdır).
  • b.ReportAllocs() — -benchmem olmasa bile tahsis raporlamasını zorlayın.

b.Run ile karşılaştırma tablosu

Tıpkı testler için t.Run gibi, parametrik kıyaslamalar için de b.Run vardır:

Go
func BenchmarkSplit(b *testing.B) {
    for _, size := range []int{10, 1000, 100000} {
        b.Run(fmt.Sprintf("n=%d", size), func(b *testing.B) {
            s := strings.Repeat("a,", size)
            b.ResetTimer()
            for i := 0; i < b.N; i++ {
                _ = strings.Split(s, ",")
            }
        })
    }
}

BenchmarkSplit/n=10-8, BenchmarkSplit/n=1000-8 gibi satırların çıktısını alın, ... grafiklerin ölçeklendirilmesi için idealdir.

İki uygulamayı benchstat ile karşılaştırma

Bash
go test -bench=. -count=10 > old.txt
# apply change
go test -bench=. -count=10 > new.txt
benchstat old.txt new.txt

benchstat (golang.org/x/perf/cmd/benchstat içinde) farkın ortalamasını, standart sapmasını ve istatistiksel önemini hesaplar.

Egzersizler

Egzersiz#go.m9.l3.e1
Denemeler: 0Yükleniyor…

BenchmarkSum'u, Sum(2, 3)'ü çağıran b.N üzerindeki döngüyle tanımlayın.

Düzenleyici yükleniyor…

3 denemeden sonra çözüm mevcut

Egzersiz#go.m9.l3.e2
Denemeler: 0Yükleniyor…

Pahalı kurulumdan SONRA döngüden önce b.ResetTimer'ı ekleyin, böylece kurulum ölçüme dahil edilmez.

Düzenleyici yükleniyor…

3 denemeden sonra çözüm mevcut

Quiz#go.m9.l3.e3
Hazır

Paketteki tüm kriterleri hangi bayrak çalıştırır?

Go
$ go test ???
Cevap seçenekleri