« Tüm yayınlar

Go Derleyicisi Slice Tahsislerini Yığında Yapıyor

Go 1.24-1.26 arası derleyici, sabit ve değişken boyutlu slice'ları yığında (stack) tahsis ederek heap yükünü ve GC baskısını azaltıyor.

Go blogundaki bu yazı, dilin son sürümlerinde heap tahsislerini azaltmaya yönelik derleyici optimizasyonlarını ele alıyor. append ile büyütülen slice'larda, arka plandaki dizinin tekrar tekrar heap'te tahsis edilip eskisinin çöp haline gelmesi ciddi bir maliyet oluşturuyor; bu hem çöp toplayıcıya (GC) yük bindiriyor hem de önbellek dostu olmayan bir bellek kullanım deseni yaratıyor. Yazı, make ile sabit kapasiteli slice oluşturmanın Go 1.24'te derleyici tarafından otomatik olarak yığına (stack) taşınabildiğini, ancak kapasite değişken bir değişkenden geldiğinde bu optimizasyonun devre dışı kaldığını gösteriyor.

Go 1.25 ile birlikte derleyici, değişken boyutlu make çağrıları için küçük (32 bayt) bir spekülatif arka plan dizisini yığında önceden tahsis ediyor; istenen boyut bu sınıra uyuyorsa heap'e hiç gidilmiyor, aksi halde normal heap tahsisi devreye giriyor. Go 1.26'da ise bu mekanizma append çağrılarının kendisine de uygulanıyor: ilk birkaç eleman için heap yerine yığında küçük bir arka plan dizisi kullanılıyor, böylece slice'ın büyüme başlangıcındaki tekrarlı 1-2-4 boyutlu heap tahsisleri ve bunların ürettiği çöp önemli ölçüde ortadan kalkıyor.

Bu değişiklikler mühendisler için pratik bir sonuç doğuruyor: kaçan (escape etmeyen) küçük slice'lar artık kod değiştirmeden, sadece Go sürümünü yükselterek daha az heap tahsisiyle çalışabiliyor. Ancak fonksiyondan döndürülen (escape eden) slice'lar için yığın tahsisi mümkün değil, çünkü fonksiyon dönünce stack çerçevesi ortadan kalkıyor; yazı bu sınırın nasıl ele alınabileceğine dair bir sonraki adımı işaret ederek kapanıyor.

» KaynakThe Go Blog