CodeBlanks Logo Icon CodeBlanks

Benchmark karşılaştırma

benchstat ile benchmark sonuçlarını karşılaştırmayı öğrenirsin.

Benchmark karşılaştırma

Tek bir çalıştırma gürültülüdür. Doğru karşılaştırma için her sürümü birkaç kez çalıştırıp benchstat ile istatistiksel olarak kıyaslarsın:

go test -bench=Ayristir -count=10 > eski.txt
# kodu değiştir
go test -bench=Ayristir -count=10 > yeni.txt
benchstat eski.txt yeni.txt

benchstat ortalama farkı, güven aralığını ve farkın anlamlı olup olmadığını (p-değeri) gösterir.

Gürültüyü azaltmak

Ölçüm sırasında makinede başka yoğun iş çalıştırma, dizüstüde şarj kablosunu tak (güç tasarrufu frekansı düşürür) ve -count ile en az 6–10 örnek al. CI'da performans gerilemelerini yakalamak için benchmark sonuçlarını saklayıp her değişiklikte benchstat ile karşılaştırmak yaygın bir uygulamadır.

Uygulama Basit kıyas

İki birleştirme yöntemini kıyasla: += ile ve strings.Builder ile 50 parça birleştir. Her biri için 5 kez testing.Benchmark çalıştırıp en küçük NsPerOp değerini al ve Builder'ın daha hızlı olduğunu yazdır.

Başlangıç kodu

main.go
package main

import (
    "fmt"
    "strings"
    "testing"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "fmt"
    "strings"
    "testing"
)

var sink string

func enIyi(f func()) int64 {
    var min int64 = -1
    for k := 0; k < 5; k++ {
        r := testing.Benchmark(func(b *testing.B) {
            for i := 0; i < b.N; i++ {
                f()
            }
        })
        if min < 0 || r.NsPerOp() < min {
            min = r.NsPerOp()
        }
    }
    return min
}

func main() {
    arti := enIyi(func() {
        s := ""
        for i := 0; i < 50; i++ {
            s += "x"
        }
        sink = s
    })
    builder := enIyi(func() {
        var sb strings.Builder
        for i := 0; i < 50; i++ {
            sb.WriteString("x")
        }
        sink = sb.String()
    })
    fmt.Println(builder < arti)
}

Beklenen çıktı

true

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 benchstat "~" gösteriyorsa ne anlama gelir?

  • Kod iki kat hızlandı
  • Benchmark hata verdi
  • Ayırma yok
  • Fark istatistiksel olarak anlamlı değil Doğru cevap

Açıklama: "~" ölçülen farkın gürültüden ayırt edilemediğini söyler; değişikliğin performansa etkisi kanıtlanamamıştır.

2 Tekrar sayısı

Soru
go test -bench=. ____=10 > yeni.txt
Cevap
go test -bench=. -count=10 > yeni.txt

Açıklama: -count her benchmark'ı belirtilen sayıda çalıştırır; benchstat bu örneklerle istatistik hesaplar.

3 Araç ve görev

Kavram Anlamı
-count=10 Çok örnek
benchstat İstatistiksel kıyas
p-değeri Anlamlılık
~ Anlamlı fark yok

Orta seviye bölümündeki tüm dersler