15 Eylül 2012 Cumartesi

Java neden yavaş?

Hayattaki klişelerden birisi de herhalde "Java yavaş" sözüdür.  Bu sözü ara sıra ufak çaplı bilgisayarcı tartışmalarında duymak mümkündür. Doğruluk payı yok değil aslında, Java yavaştır, ama neden ve ne zaman yavaştır sorusunun cevabı daha önemli.

Java'nın yavaş olmasına sebep olarak genellikle makine kodu yerine bytecode'a çevirmesi söylenir. Bu belki bir instruction ilk kez çalıştırılırken doğrudur, ama JIT mekanizması sayesinde aynı instruction'ın sonraki çalıştırılmalarında doğrudan doğruya makine kodu çalışacaktır. Dolayısıyla web server gibi uzun süreli çalışan programlarda bu bir yavaşlık oluşturmamalıdır.

Peki Java neden yavaştır? Java'nın yavaş olmasının benim gördüğüm iki büyük sebebi vardır.

1- Bütün objeler heap'te ayrılır, yani ayırma ve bırakma işlemi için işletim sistemine gidilir. c++'da ise bu iş stack'te halledildiğinden stack pointer'ını azaltıp arttırarak hızlıca allocation yapılabilir. Bu bilhassa  yoğun şekilde güncellenmesi gereken grafik tarzı programlarda çok önemli bir darboğaz yaratmaktadır. Sözgelimi 30fps ile çalışacak bir oyunun 33 milisaniyede bir güncellenebilmesi gerekir ve sürekli heapten alınıp bırakılan nokta tarzı hesaplama objeleri bunu zorlaştırabilir.

2- Obje cast'ları: Java'da bütün objelerin cast'ları dinamiktir. Generic(c++'taki template) kullanılsa bile bu değişmez bildiğim kadarıyla. C++'ta ise template kullanıldığı zaman bu cast compile zamanında halledilmiş olur. Çalışma zamanına ek bir yük bindirmez. Bu da performansı arttırır haliyle.

Java'nın object oriented tabiatından kaynaklanan birkaç performans eksikliğinin daha olduğunu biliyorum. Mesela fonksiyonları inline etmek gibi. Ama sanırım bu iki örnek yeterli, diğerleri de zaten biraz daha gelişmiş konular.

Özetle, Java'nın yavaş olmasının sebebi makine koduna çevirilmesinden kaynaklanmıyor. Herşeyin obje olmasından kaynaklanıyor. Bunu çözmek için de JNI diye birşey geliştirilmiş bu arada.

Hamiş: Obje kullanmaktan ileri gelen tüm yavaşlıklar Python ve PHP için de geçerli olmalı.

Hiç yorum yok:

Yorum Gönder