Oldukça farklı iki soru soruyorsunuz:
- Java gerçekten yavaş mı ve öyleyse neden?
- Java, birçok alternatiften daha hızlı olmasına rağmen neden yavaş olarak algılanıyor?
Bunlardan ilki aşağı yukarı “ipin ne kadar uzun” bir sorudur. "Yavaş" tanımınıza gelir. Saf bir tercümanla karşılaştırıldığında, Java son derece hızlıdır. (Normalde) bir çeşit bayt koduna derlenen ve daha sonra dinamik olarak makine koduna (örn. C # veya .NET'teki başka bir şey) derlenen diğer dillerle karşılaştırıldığında, Java kabaca eşittir. Normalde saf makine koduna derlenen dillerle karşılaştırıldığında ve (genellikle büyük), optimize edicilerini (ör. C, C ++, Fortran, Ada) geliştirmekten başka hiçbir şey üzerinde çalışmayan insan ekiplerine sahip olan Java, birkaç şeyde oldukça başarılıdır , ancak genel olarak en azından biraz daha yavaş olma eğilimindedir.
Bunların çoğu öncelikle uygulama ile ilgilidir - temel olarak, bir dinamik / JIT derleyicisi çalışırken bir kullanıcının beklediği gerçeğine gelir, bu nedenle başlamak için oldukça uzun bir süre çalışan bir programınız yoksa, derleyicinin zor optimizasyonlara çok zaman harcamasını haklı çıkarmak zor. Bu nedenle, çoğu Java (ve C # vb.) Derleyici gerçekten zor optimizasyonlar için çok çaba sarf etmez. Çoğu durumda, hangi optimizasyonların yapıldığı, uygulandıkları yerden daha azdır. Çoğu optimizasyon problemi NP tamamlanmıştır, bu nedenle aldıkları süre saldırıya uğrayan sorunun boyutuyla hızla büyür. Zamanı mantıklı tutmanın bir yolu, optimizasyonu aynı anda yalnızca tek bir işlev gibi bir şeye uygulamaktır. Derleyiciyi bekleyen yalnızca geliştirici olduğunda, çok daha uzun sürebilir ve aynı optimizasyonu programın daha büyük parçalarına uygulayabilirsiniz. Benzer şekilde, bazı optimizasyonların kodu oldukça tüylüdür (ve bu nedenle oldukça büyük olabilir). Yine, kullanıcı bu kod yüklenirken beklediğinden (ve JVM başlangıç zamanı genellikle toplam süre için önemli bir faktördür), uygulama bir yerde kaydedilen zamanı diğerinde kaybolan zamanla dengelemek zorundadır ve ne kadar az kod verilirse tüylü optimizasyonlardan faydalanır, JVM'yi küçük tutmak genellikle daha faydalıdır.
İkinci bir sorun, Java ile sık sık daha fazla veya daha az "tek beden herkese uyar" türünde bir çözüm elde etmenizdir. Örneğin, birçok Java geliştiricisi için Swing aslında mevcut olan tek pencere kütüphanesidir. C ++ gibi bir şeyde, kelimenin tam anlamıyla düzinelerce pencere kütüphanesi, uygulama çerçevesi vb. Vardır; bunların her biri, kullanım kolaylığı ile hızlı yürütme, tutarlı görünüm ve his vs yerel görünüm ve his vb. Arasında kendi uzlaşma setlerine sahiptir. Tek gerçek yapışma noktası bazılarının (örneğin Qt) oldukça pahalı olabileceğidir (en azından ticari kullanım için).
Üçüncüsü C ++ (ve C daha da fazla) ile yazılmış bir sürü kod sadece daha eski ve daha olgun. Birçoğu, kodları optimize etmek için ekstra zaman harcamak normal, beklenen davranış olduğunda, on yıllar önce yazılmış bir rutin çekirdeği içerir. Bu genellikle kodda daha küçük ve daha hızlı gerçek bir yararı vardır. C ++ (veya C), kodun küçük ve hızlı olması için kredi alır, ancak gerçekten daha çok geliştiricinin bir ürünü ve kodun yazıldığı zamanın kısıtlamaları. Bir dereceye kadar, bu kendini gerçekleştiren bir kehanete yol açar - insanlar hızı önemsediğinde, genellikle bu şöhrete sahip olduğu için C ++ 'ı seçerler. Optimizasyona ekstra zaman ve çaba harcarlar ve yeni nesil hızlı C ++ kodu yazılır.
Özetlemek gerekirse, Java'nın normal uygulaması en iyi şekilde maksimum optimizasyonu sorunlu hale getirir. Daha da kötüsü, Java'nın görünür olduğu yerlerde , pencere araç takımları ve JVM başlangıç zamanı gibi şeyler genellikle dilin yürütme hızından daha büyük bir rol oynar. Çoğu durumda, C ve C ++ aynı zamanda optimizasyonda daha çok çalışmanın ürünü için de kredi alır.
İkinci soruya gelince, bence bu büyük ölçüde işteki insan doğası meselesidir. Birkaç zealot Java'nın kör edici derecede hızlı olduğu konusunda oldukça şişirilmiş iddialarda bulunuyor. Birisi dener ve önemsiz bir programın bile başlaması birkaç saniye alır ve çalıştığında yavaş ve sakar hisseder. Çok azı, bunun büyük bir kısmının JVM'nin başlangıç zamanı olduğunu ve şeyleri ilk denediğinde, kodun henüz derlenmediğini - kodun bazılarının yorumlandığını fark etmek için işleri analiz etmekle uğraşmaktadır. ve bazıları beklerken derleniyor. Daha da kötüsü, yeterince hızlı çalışsa bile, görünüm ve his çoğu kullanıcı için genellikle yabancı ve beceriksiz görünecektir, bu nedenle objektif ölçümler hızlı tepki süreleri gösterse bile, hala beceriksiz görünecektir.
Bunları bir araya getirmek oldukça basit ve doğal bir reaksiyona yol açar: Java'nın yavaş, çirkin ve sakar. Orada aşırı tepki eğilimi var ve olarak düşünmek sonuçlandıracaktır, hızlı gerçekten söyleyerek yutturmaca Verilen korkunç yerine (daha kesin) arasında yavaş "biraz daha yavaş ve çoğunlukla belirli koşulları altında." Bu genellikle dilde ilk birkaç programı yazan bir geliştirici için en kötüsüdür. Çoğu dilde "merhaba dünya" programının yürütülmesi anlık görünür, ancak Java'da JVM başlarken kolayca algılanabilir bir duraklama olur. Sıkı döngülerde çok daha yavaş çalışan saf bir yorumcu bile, böyle kod için genellikle daha hızlı görünecektir, çünkü sadece yüklenebilir ve biraz daha erken çalışmaya başlayabilir.