Meydan okuma 2 - Performans
- Go kursu
- Uzman
- Ders 32/34
- 8 dk
GC ve alloc'leri inceleyen bir performans analizi yazarsın.
Meydan okuma: GC baskısını azalt
Bir log işleyici her satır için yeni bir []string oluşturuyor:
func alanlar(line string) []string {
return strings.Split(line, " ")
}Saniyede yüz binlerce satırda bu, sürekli GC demektir. Görevin: alanları yeniden kullanılabilen bir tampona yazan alanlarInto(dst []string, line string) []string fonksiyonu yazmak ve döngüde ayırma sayısının sıfıra indiğini göstermek.
Plan
Alt dizgeler (substring) Go'da kopya değil, aynı belleğe bakan yeni başlıklardır; bu yüzden line[bas:i] ayırma yapmaz. Fonksiyon: dst = dst[:0], satırı karakter karakter gez, boşlukta parçayı ekle, sonda kalan parçayı ekle. Ölçüm: testing.AllocsPerRun ile aynı buf üzerinde tekrar çağır.
Uygulama Sıfır ayırma
alanlarInto'yu yaz. buf := make([]string, 0, 8) ile "GET /api 200 12ms" satırını işle; alan sayısını ve testing.AllocsPerRun sonucunu tek satırda yazdır.
Başlangıç kodu
package main
import (
"fmt"
"testing"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"testing"
)
func alanlarInto(dst []string, line string) []string {
dst = dst[:0]
bas := 0
for i := 0; i < len(line); i++ {
if line[i] == ' ' {
dst = append(dst, line[bas:i])
bas = i + 1
}
}
return append(dst, line[bas:])
}
func main() {
line := "GET /api 200 12ms"
buf := make([]string, 0, 8)
a := testing.AllocsPerRun(100, func() { buf = alanlarInto(buf, line) })
fmt.Println(len(buf), a)
}Beklenen çıktı
4 0
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>dst[:0]</code> ifadesi ne yapar?
- nil döndürür
- Kapasiteyi koruyup uzunluğu sıfırlar Doğru cevap
- Yeni dizi ayırır
- Diziyi siler
Açıklama: Aynı alttaki dizi korunur; append yeniden ayırma yapmadan baştan yazar.
2 Tamponu sıfırla
func alanlarInto(dst []string, line string) []string {
dst = dst____
// ...
func alanlarInto(dst []string, line string) []string {
dst = dst[:0]
// ...
Açıklama: dst[:0] kapasiteyi koruyarak tamponu boşaltır.
3 İfade ve maliyet
| Kavram | Anlamı |
|---|---|
strings.Split |
Her çağrıda yeni dilim |
dst[:0] |
Tamponu yeniden kullan |
line[a:b] |
Kopyasız alt dizge |
AllocsPerRun |
Ayırma ölçümü |