Çünkü performansı optimize etmek ve tamamen güvenliği kapatmak arasında çok büyük bir fark var.
GC sayısını azaltarak, onların çerçevesi daha duyarlıdır ve (muhtemelen) daha hızlı çalışabilir. Artık, çöp toplayıcı için en iyi duruma getirme, hiçbir zaman çöp toplama işlemi yapmadıkları anlamına gelmez. Sadece daha az sık yaptıkları ve bunu yaptıkları zaman çok hızlı çalıştıkları anlamına geliyor. Bu tür bir optimizasyon şunları içerir:
- Küçük fırlatma nesneleri kullanarak hayatta kalan bir alana (yani en az bir çöp toplama işleminde hayatta kalan) hareket eden nesne sayısının en aza indirilmesi. Hayatta kalan alana taşınan nesnenin toplanması daha zordur ve çöp toplanması bazen JVM'nin dondurulması anlamına gelir.
- Başlamak için çok fazla nesne ayırmayın. Bu, dikkatli olmamanız durumunda geri tepebilir, çünkü genç kuşak nesneler tahsis etmek ve toplamak süper ucuzdur.
- Yeni nesnenin eskisine işaret etmesini sağlayın (tersi yönde değil), böylece genç nesnenin toplanmasının kolay olmasını sağlar, çünkü onların tutulmalarına neden olacak hiçbir referans yoktur.
Performansı ayarladığınızda, genellikle çalışmayan bir kodu görmezden gelirken, genellikle çok özel bir "sıcak nokta" ayarlarsınız. Bunu Java'da yaparsanız, çöp toplayıcının, dar bir döngüde çalışan alan için çok dikkatli bir şekilde optimizasyon yaparken (çok fazla fark yaratmayacağından), o karanlık köşeyle ilgilenmesine izin verebilirsiniz. Böylece, nerede optimize edeceğinizi ve nerede istemediğinizi seçebilir ve böylece çabanızı önemli olan yere odaklayabilirsiniz.
Şimdi, tamamen çöp toplama işlemini kapatırsanız, seçim yapamazsınız . Her nesneyi manuel olarak elden çıkarmalısınız . Bu yöntem günde en fazla bir kere çağrılıyor mu? Java'da, performansının etkisi göz ardı edilebileceği için izin verebilirsiniz (her ay tam bir GC gerçekleşmesine izin vermek uygun olabilir). C ++ 'da hala kaynak sızdırıyorsunuz, bu yüzden bu belirsiz metoda bile dikkat etmeniz gerekiyor. Bu nedenle , uygulamanızın her bir bölümünde kaynak yönetimi için ücret ödemeniz gerekir , oysa Java'da odaklanabilirsiniz.
Ama daha da kötüleşiyor.
Ya bir hatanız varsa, uygulamanızın yalnızca Pazartesi günü dolunayda erişilen karanlık bir köşesinde diyelim mi? Java'nın güçlü güvenlik garantisi vardır. "Tanımlanamayan davranış" yok denecek kadar az şey var. Yanlış bir şey kullanırsanız, bir İstisna atılır, programınız durur ve veri bozulması olmaz. Yani farketmeden yanlış bir şey olamayacağından eminsin.
Ancak D gibi bir durumda, kötü bir işaretçi erişimine veya arabellek taşmasına sahip olabilirsiniz ve belleğinizi bozabilirsiniz, ancak programınız bilmeyecek (güvenliği kapattınız, hatırladınız mı?) Ve hatalı çalışmaya devam edecek veri ve bazı kötü şeyler yapmak ve verilerinizi bozmak ve bilmiyorsunuz ve daha fazla yolsuzluk olur, verileriniz gittikçe daha yanlış olur ve sonra aniden kırdı ve hayat kritik bir uygulamadaydı ve bazı hata bir roketin hesaplamasında oldu ve değil işi ve roket patlayabilir ve birisi kalıp, yapar ve şirket her gazetenin ön sayfasında yer almaktadır ve patronunuz noktası olan parmak yüzden size söyleyerek "Sen vardır performansı optimize etmek için D'yi kullanmamızı öneren mühendis, neden güvenliği düşünmediniz?". Ve bu senin suçun. Bu insanları aptalca gösteri girişimlerinde öldürdün.
Tamam, tamam, çoğu zaman bundan daha az dramatik. Ancak işle ilgili kritik bir uygulama veya yalnızca bir GPS uygulaması veya bir hükümet sağlık web sitesi bile, eğer sorunlarınız varsa oldukça olumsuz sonuçlar doğurabilir. Bunları tamamen engelleyen veya gerçekleştiğinde hızlı bir dil kullanmak genellikle çok iyi bir fikirdir.
Bir güvenliği kapatmanın bir bedeli vardır. Yerli olmak her zaman mantıklı olmaz. Bazen, kendinizi en iyi şekilde ayağınıza vurabileceğiniz bir dilde kullanmak için biraz güvenli bir dili optimize etmek çok daha basit ve daha güvenlidir. Bir çok durumda doğruluk ve güvenlik, GC'yi tamamen ortadan kaldırarak hurdaya ayıracağınız birkaç nano saniyeyi aşmaktadır. Engelleyici aygıtı olabilir ben LMAX-Değişim doğru kararı düşünüyorum bu yüzden, bu durumda kullanılabilir.
Peki ya özellikle D? Karanlık köşeler için isterseniz bir GC'niz var ve SafeD alt kümesi (düzenlemeden önce bilmediğim) tanımsız davranışları kaldırıyor (kullanmayı hatırlıyorsanız!).
Bu durumda basit bir vade sorusu. Java ekosistemi iyi yazılmış bir araç ve olgun kütüphanelerle doludur (gelişim için daha iyidir). Çok daha fazla geliştirici Java'yı D'den daha çok biliyor (bakım için daha iyi). Finansal bir uygulama kadar kritik bir şey için yeni ve popüler olmayan bir dilin kullanılması iyi bir fikir olmazdı. Az bilinen dilde, eğer bir probleminiz varsa, çok azı size yardımcı olabilir ve bulduğunuz kütüphanelerde daha az insana maruz kaldıklarından daha fazla böcek olabilir.
Bu yüzden son noktam hala geçerli: Korkunç sonuçları olan sorunlardan kaçınmak istiyorsanız, güvenli seçimlerle devam edin. D'nin hayatındaki bu noktada, müşterisi çılgın risk almaya hazır küçük girişimlerdir. Bir problem milyonlara mal olabilirse, inovasyon zili eğrisinde daha iyi olursunuz .