2015-02-28 22 views
8

Zaman zaman sıfır çöp veya etkin bellek kullanımı gibi kavramlarla karşılaşıyorum. Örnek olarak iyi bilinen paketin özellikleri httprouter aşağıdakileri görebilirsiniz:Golang. Sıfır Çöpün yayılması veya etkin bellek kullanımı

sıfır Çöp: uygun ve sevk işlemi çöp sıfır bayt oluşturur. Aslında, yapılan tek yığın ayırma, yol parametreleri için anahtar/değer çiftlerinin dilimini oluşturmaktır. İstek yolu parametreler içermiyorsa, tek bir yığın ayırma gerekli değildir.

Ayrıca bu paket standart kütüphanenin http.ServeMux göre çok iyi kıyaslama sonuçlarını gösterir:

BenchmarkHttpServeMux   5000  706222 ns/op   96 B/op  6 allocs/op 
BenchmarkHttpRouter   100000  15010 ns/op   0 B/op  0 allocs/op 

Bildiğim kadarıyla ikinci bir (tablodan) hiçbir yığın bellek ayırma ve sıfır ortalaması var anladığım kadarıyla tekrar başına yapılan tahsislerin sayısı.

Soru:: Bellek yönetiminin temel bir anlayışını öğrenmek istiyorum. Çöp toplayıcısı ,/belleği ayırdığında bellek ayırır. Karşılaştırma sayıları (tablonun son iki sütunu) ne anlama gelir ve insanların yığın ayırırken nasıl bildiğini gösterir?

Bellek yönetiminde kesinlikle yeniyim, bu yüzden "başlık altında" neler olduğunu anlamak gerçekten zor. haberler okudum:

cevap

8

çöp toplayıcı :-) bellek değil, sadece serbest bırakır. Go'nun çöp toplayıcıları evrim geçiriyor. Ayrıntılar için https://docs.google.com/document/d/16Y4IsnNRCN43Mx0NZc5YXZLovrHvvLhK_h0KN8woTO4/preview?sle=true tasarım belgesine bir göz atın ve golang posta listelerindeki tartışmayı takip edin.

Gösterge çıktısının son iki sütunu son derece basit: Toplamda kaç bayt ayrıldı ve karşılaştırma kodunun bir yinelemesi sırasında kaç tane ayırma yapıldı. (Bu tahsis, çöp toplayıcı tarafından değil, kodunuz tarafından yapılır). Herhangi bir tahsisat potansiyel olarak çöp sayısının azalması olduğundan, bu sayıları azaltmak tasarım hedefi olabilir.

Öğeler yığın üzerinde ne zaman ayrılıyor? Go derleyici ne zaman karar verir! Derleyici, yığına ayırmaya çalışır, ancak özellikle bir yığın yerel yığın temelli kapsamlardan çıkarsa bazen yığını kullanmalıdır. Bu kaçış analizi şu anda yeniden işlenmekte olduğundan, özellikle derleyici sürümünden sürümüne değiştiği için hangi değerin yığın veya yığıt olarak ayrılacağını söylemek kolay değildir.

Kıyaslamalarınız çok fazla GC yükü gelene kadar tahsislerden kaçınmaya çok takıntılı olmazdım.

+0

@OP - "yeniden işlenmesi" bu örnekte, kaçış analizi sırasında değişkenlerin kaçmaması gereken zamanların olması gerektiği anlamına gelir - ve Git ekibi bunun farkındadır. Bu, yığın tahsisi almanız gerektiğinde yığın ayırma aldığınız anlamına gelir. Üzerinde bir yerde büyüleyici bir belge var (şu anda go-dev'de bulamıyorum)."Kaçış analizi" terimi, araştırmanız için yararlı olacaktır. Güzel cevap Volker :) –