CodeBlanks Logo Icon CodeBlanks

Benchmark fonksiyonu

func BenchmarkXxx imzasını ve go test -bench öğrenirsin.

Benchmark fonksiyonu

Benchmark'lar _test.go dosyasında Benchmark ile başlar ve *testing.B alır. Ölçülecek kod b.N kez çalıştırılır; Go, b.N'yi ölçüm güvenilir olana kadar otomatik büyütür.

func BenchmarkBirlestir(b *testing.B) {
    for i := 0; i < b.N; i++ {
        strings.Join([]string{"a", "b", "c"}, ",")
    }
}

Çalıştırma: go test -bench=. -benchmem → BenchmarkBirlestir-8 25000000 48 ns/op 16 B/op 1 allocs/op

Derleyiciyi kandırmamak

Sonucu hiç kullanılmayan bir hesap derleyici tarafından silinebilir ve benchmark gerçekte hiçbir şey ölçmez. Sonucu paket düzeyi bir değişkene ata:

var sink string

func BenchmarkX(b *testing.B) {
    for i := 0; i < b.N; i++ {
        sink = strings.Repeat("a", 10)
    }
}

Go 1.24'ten itibaren for b.Loop() { ... } biçimi bu sorunu ve zamanlayıcı ayarlarını kendisi çözer.

Uygulama İlk benchmark

testing.Benchmark ile strings.Repeat yerine fmt.Sprintf("%d", i) çağıran bir benchmark çalıştır; sonucu sink değişkenine ata. Sonucun N değerinin 0'dan büyük olduğunu yazdır.

Başlangıç kodu

main.go
package main

import (
    "fmt"
    "testing"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "fmt"
    "testing"
)

var sink string

func main() {
    r := testing.Benchmark(func(b *testing.B) {
        for i := 0; i < b.N; i++ {
            sink = fmt.Sprintf("%d", i)
        }
    })
    fmt.Println(r.N > 0)
}

Beklenen çıktı

true

Soru ve cevaplar

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

1 Çıktıdaki <code>-8</code> soneki neyi gösterir?

  • Tekrar sayısı
  • Ayırma sayısı
  • Go sürümü
  • GOMAXPROCS değeri Doğru cevap

Açıklama: Benchmark adının sonundaki sayı, ölçümün kaç P ile yapıldığını söyler; -cpu=1,4 ile farklı değerler denenebilir.

2 Tekrar sayısı

Soru
for i := 0; i < b.____; i++ {
    sink = hesapla()
}
Cevap
for i := 0; i < b.N; i++ {
    sink = hesapla()
}

Açıklama: b.N, Go'nun ölçüm için seçtiği tekrar sayısıdır.

3 Çıktı sütunu

Kavram Anlamı
ns/op İşlem başına süre
B/op İşlem başına bayt
allocs/op İşlem başına ayırma
-8 GOMAXPROCS

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