Sub-benchmark
- Go kursu
- Orta seviye
- Ders 50/80
- 4 dk
b.Run ile alt benchmark çalıştırmayı öğrenirsin.
Sub-benchmark
b.Run ile farklı girdi boyutlarını tek benchmark altında ölçebilirsin; büyüme davranışı (doğrusal mı, karesel mi) böyle görünür:
func BenchmarkAra(b *testing.B) {
for _, n := range []int{10, 1000, 100000} {
veri := sirali(n)
b.Run(fmt.Sprintf("n=%d", n), func(b *testing.B) {
for i := 0; i < b.N; i++ {
sinkBool = ikiliAra(veri, n/2)
}
})
}
}Çıktı: BenchmarkAra/n=10, BenchmarkAra/n=1000... -bench=Ara/n=1000 ile tek alt ölçüm çalıştırılır.
Veriyi dışarıda hazırla
Alt benchmark'ın girdisini b.Run çağrısından önce hazırlamak, hazırlık süresinin ölçüme girmesini önler; her alt benchmark kendi zamanlayıcısıyla başlar. b.Run'a verilen kapanış, döngü değişkenini (Go 1.22'den beri her turda yeni olan n) güvenle yakalar.
Uygulama Boyutlara göre ölçüm
topla(n int) int 1'den n'ye kadar döngüyle toplasın. []int{10, 1000} boyutları için testing.Benchmark ile ölç ve büyük boyutun işlem başına süresinin (NsPerOp()) küçükten fazla olduğunu yazdır.
Başlangıç kodu
package main
import (
"fmt"
"testing"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"testing"
)
var sink int
func topla(n int) int {
t := 0
for i := 1; i <= n; i++ {
t += i
}
return t
}
func main() {
var sure []int64
for _, n := range []int{10, 1000} {
r := testing.Benchmark(func(b *testing.B) {
for i := 0; i < b.N; i++ {
sink = topla(n)
}
})
sure = append(sure, r.NsPerOp())
}
fmt.Println(sure[1] > sure[0])
}Beklenen çıktı
true
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 n 100 kat büyüdüğünde ns/op da yaklaşık 100 kat büyüyorsa algoritma nasıldır?
- Doğrusal (O(n)) Doğru cevap
- Logaritmik (O(log n))
- Sabit (O(1))
- Karesel (O(n²))
Açıklama: Süre girdiyle aynı oranda büyüyorsa doğrusaldır; karesel olsaydı 10.000 kat, logaritmik olsaydı çok az büyürdü.
2 Alt benchmark
b.____(fmt.Sprintf("n=%d", n), func(b *testing.B) {
// ...
})
b.Run(fmt.Sprintf("n=%d", n), func(b *testing.B) {
// ...
})
Açıklama: b.Run verilen adla bir alt benchmark başlatır.
3 Karmaşıklık ve büyüme (n×100)
| Kavram | Anlamı |
|---|---|
O(1) |
Değişmez |
O(log n) |
~3 kat |
O(n) |
~100 kat |
O(n²) |
~10.000 kat |