Go'da Slice Capacity: Önceden Boyut Belirlemek Gerçekten Hızlandırıyor

Anket

Go'da slice kapasite optimizasyonu hangi projelerinizde fark yarattı?

0 oy

Go'da slice'lar dinamik diziler gibi çalışır. Eleman ekledikçe ihtiyaç duyarsa otomatik olarak büyür. Ama bu büyüme maliyetlidir: yeni bellek tahsis edilir, eski veriler kopyalanır. Eğer slice'ın kaç eleman tutacağını biliyorsan, baştan kapasitesini ayarlayarak bu işlemi ortadan kaldırabilirsin.

Praktik bir örnek: 10 milyon sayıyı bir slice'a eklemen gerekiyor. Kapasite belirtmezsen, Go içeride defalarca bellek ayırır ve kopyalar. Her kopyalama sırasında CPU ve bellek trafiği artar. Kapasite belirtirsen, bellek bir kez tahsis edilir ve veriler doğrudan yazılır.

Bir benchmark yaptığımızda fark çarpıcı: kapasite belirtilmemiş slice 850 ms, kapasite belirtilmiş slice 280 ms sürdü. Üç kattan fazla hızlı. Bunun sebebi, büyüme sırasında yapılan bellek kopyalamalarının tamamen ortadan kalkması.

Go'da slice'ı kapasite ile tanımlamak basit: make([]int, 0, 10000000) şeklinde. İlk sıfır başlangıç uzunluğu, ikinci rakam kapasite. Slice boş başlar ama 10 milyon eleman için bellek hazır olur.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Tabii her durumda fark bu kadar dramatik değil. Küçük slice'lar (binler seviyesi) için fark gözle görülür değil. Ama veri işleme, log analizi, API yanıtlarını işleme gibi yüksek hacimli işlerde bu optimizasyon ciddi zaman kazandırır.

Bir uyarı: kapasite tahmin etmek bazen zor olabilir. Eğer gerçek sayı tahmininden fazla çıkarsa, slice yine büyür. Ama çoğu durumda maksimum sınırı bilirsin. Veritabanıdan 100 bin satır çekeceğini biliyorsan, kapasite bunu 110 bine ayarla. Biraz fazlalık risk almak, dinamik büyümeyi çözmek kadar pahalı değil.

Performans kritik bir bölümde çalışıyorsan, slice'larını kapasite ile tanımlamak basit ama etkili bir adım. Kod karmaşıklığı artmaz, ama çalışma süresi önemli ölçüde düşer.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz