CodeBlanks Logo Icon CodeBlanks

Meydan okuma 2 - Performans

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

main.go
package main

import (
    "fmt"
    "testing"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
func alanlarInto(dst []string, line string) []string {
    dst = dst____
    // ...
Cevap
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ü

Uzman bölümündeki tüm dersler