Hoşgeldin, elina! :)
Alıntı (elina):
> Merhaba, D dilini araştırırken sahip olduğu GC üzerine çok fazla eleştiri aldığını okudum
Çöp toplayıcı geleneksel olarak performansla ilgili belirsizlik sunar. D'nin yakın olduğu dillerden C ve C++ bu yüzden çöp toplayıcıdan uzak dururlar ve hatta onu kötülerler. :) (Öte yandan, "boehm collector" C ve C++'çı Hans Böhm tarafından yazılmıştır.)
C ve C++ nesnelerin belirli zamanlarda sonlandırılmalarının doğru olduğunu savunur (deterministic destruction) ama bazı karşılaştırmalar çöp toplayıcının daha hızlı olabildiğini göstermiştir. (Bartosz Milewski'nin yazıları bu konuya değinir ama şimdi kaynak aramıyorum. :) Örneğin, belirli bir anda sonlandırılan bir C++ nesnesi her elemanı binlerce elemana sahip binlerce elemanlı vector olabilir ve bir sürü temizlik işlemi ve belleğin tek tek geri verilmesi çöp toplayıcının toplam işleminden yavaş olabilir.)
D'nin benzetildiği Java ve C# çöp toplayıcı kullanırlar ve çöp toplayıcıdan pek şikayet etmezler. Python ve başka bir sürü dil de mutlu mutlu çöp toplayıcı kullanır.
Burada önemli olan, çöp toplayıcının gerçekten yavaşlık getirdiği durumlarda D programcısının bir şey yapıp yapamadığıdır:
- Senin de söylediğin gibi, nogc çöp toplayıcının kullanılmadığını garanti eder.
- Gerektiğinde malloc vs. ile kendi bellek yönetimimizi sağlayabiliriz.
- vs.
Bunlara rağmen, D'nin çöp toplayıcısı başka dillerinkiyle karşılaştırıldığında düşük nitelikli olarak kabul edilir. Örneğin, "generational" değildir. Buna rağmen, D runtime bir çöp toplayıcı arayüzü sunar ve kullanıcının kendi çöp toplayıcısını getirmesine izin verir. (Bundan yararlanan proje olduğunu duymadım.)
Yine de, sürekli iyileştiriliyor. Örneğin, bellek tarama işlemi bir iki sene önce "multi-threaded" yapıldı.
Alıntı:
> Sorularım saçma olabilir
Saçma soru yok. Sohbete devam... :)
Alıntı:
>
- D Dili'ndeki GC ne durumda? Güvenilir midir?
Doğru çalışma olarak anlıyorum; evet, bildiğim hatası yok.
Alıntı:
>
- D Dili'nde standart kütüphaneler GC ile bağlantılı mı çalışıyor?
Ne yazık ki gereğinden fazla algoritma GC'den yararlanıyor. Bunların sayısı yavaş yavaş azaltılıyor.
Alıntı:
>
- D Dili'nde yazdığım bir uygulamada GC'nin ne zaman çalışıp, çalışmadığını nasıl öğrenebilirim?
D'nin GC'si yalnızca bellek ayırırken ve eğer gerek görürse işler:
- new anahtar sözcüğü
- Dizilerin ~ ve ~= işleçleri
- Eşleme tablolarına eleman ekleme
- vs.
Alıntı:
> Eğer GC kendiliğinden çalışıyorsa fonksiyonlarda @nogc kullanmadan, GC'yi etkisiz hale getirmenin bir yolu var mıdır?
GC'nin istenmeyen taraflarından birisi, bir insanla etkileşirken programın "tutukluk yaptığının" hissedilmesidir. Bunun önüne geçmek için iki seçeneğimiz var:
-
Çöp toplayıcı programın bazı noktalarında GC.disable ve GC.enable ile etkisizleştirilebilir ve tekrar etkinleştirilebilir.
-
GC.collect, çöp toplayıcıyı işletir ve izleyen işlemler sırasında kendi kafasına göre devreye girme olasılığını azaltır.
Ben işimde kullandığım programlarda bellek ayırmanın yavaşlığından haberli olmak dışında pek özel bir şey yapmıyorum. İki programın çöp toplama için ne kadar zaman harcadıklarını şurada gösterdim:
https://youtu.be/dRORNQIB2wA?t=672
Benim programımda kabaca en fazla 50ms...
Mike Parker'ın GC yazı dizisi bu konuda yararlı olabilir:
https://dlang.org/blog/the-gc-series/
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]