Java'nın modern bir incelemesi [kapalı]


58

Birkaç yıldır programlama yapıyorum ve Java'da başladım ve zamanımda Java'nın bir şekilde aşağılık bir dil olduğunu iddia eden birçok farklı kaynak buldum. Her dilin güçlü ve zayıf yönleri olduğunu çok iyi biliyorum, ama Java hakkında okuduğum pek çok şeyin tarihli olduğu görünüyor.

Java'nın yetersiz kalmasının en sık alıntılanan nedeni, örneğin C ++ gibi diğer yerel olarak derlenmiş dillerden çok daha yavaş olmasıdır. Pek çok kişi, oyun tasarımcısı Notch'i (Minecraft'ı geliştiren) performans departmanındaki bariz eksikliği nedeniyle Java kullandığı için eleştiriyor. Java'nın çok daha yavaş olduğunu biliyorum, ancak özellikle JIT derlemesinden bu yana birçok gelişme oldu.

Java'nın bir dil olarak nesnel görüşlerini bugün almak istiyorum. Yani sorumun 4 bölümü var.

  1. Verim.

    a. Java'nın bugünkü hızı C ++ ile karşılaştırıldığında nasıldır?

    b. Java kullanarak modern bir AAA başlığı oluşturmak mümkün müdür?

    c. Java hangi alanlarda özellikle C ++ 'dan daha yavaştır? (örn. Sayı-ezme, grafik veya hemen her yer)

  2. Java şimdi derlenmiş bir dil mi yoksa yorumlanmış bir dil mi?

  3. Java'nın ilk günlerden beri ele aldığı bazı önemli eksiklikler nelerdir?

  4. Java'nın henüz ele alınmaması gereken bazı önemli eksiklikler nelerdir?

Düzenle:

Sadece açıklama amacıyla ben bu C ++ vs C ++ yapmıyorum, açıkçası ortalama c ++ biraz daha hızlı olacaktır Java. Sadece bu noktada Java'yı olgunluk açısından bir dil olarak karşılaştıracak bir şeye ihtiyacım var. C ++ sonsuza dek etrafta olduğu için, iyi bir kıyaslama noktası olacağını düşündüm.



4
10 yaşında bir şeyin artık modern olmaması gerçeğini seviyorum.
cwallenpoole

4
Java , sadece bir dil yerine bir çerçeve / platform olarak gördüğünüzde çok farklı görünüyor . Belki de sorun, adın her ikisi için de aslında "Java" olmasıdır.
Joe Internet

1
Tıpkı bir kontrast noktası olarak - Minecraft kısa süre önce 3 milyon sattı. Java'nın iddia ettiği eksikliklerin, satışları çok etkileyecek kadar zarar verdiğini sanmıyorum.
Michael K

3
Kesinlikle herhangi bir dil "bir şekilde veya başka" olarak aşağı. Tanım olarak.
SK-mantığı

Yanıtlar:


62

a. Java'nın bugünkü hızı C ++ ile karşılaştırıldığında nasıldır?

Ölçmek zor. Bir uygulamanın hızının büyük bir kısmı olan hafıza ayırıcısı Java ve C ++ 'da çok farklı algoritmalar olduğuna dikkat etmek önemlidir. Kollektörün deterministik olmayan doğası, C ++ 'nın deterministik bellek yönetimine kıyasla anlamlı bir performans verisi elde etmeyi son derece zorlaştırır, çünkü koleksiyoncunun hangi durumda olduğunu asla bilemezsiniz. Bu, bir kriter yazmanın çok zor olduğu anlamına gelir. Bu onları anlamlı şekilde karşılaştırabilir. Bazı bellek ayırma düzenleri bir GC ile çok daha hızlı çalışır, bazıları ise yerel bir tahsisatçı ile çok daha hızlı çalışır.

Ancak şunu söyleyeceğim, Java GC'nin her durumda hızlı çalışması gerektiğidir . Ancak, yerel bir tahsisatçı, daha uygun bir kişi için değiştirilebilir. Geçenlerde SO hakkında Dictionaryeşdeğer bir C # ' nın (makinemde 0.45 msn) neden çalıştırabileceği konusunda bir soru sordum.std::unordered_maphangi idamda (makinemde 10ms). Ancak, tahsisatçı ve hasher'i daha uygun olanlar için değiştirerek, bu çalışma zamanını orijinal çalışma süresinin otuzda biri olan makinemde 0.34 ms'ye indirdim. Java ile bu tür bir özel optimizasyon gerçekleştirmeyi asla ümit edemezsiniz. Bunun gerçek bir fark yaratabileceği şeyin mükemmel bir örneği, diş açmaktır. TBB gibi yerel iplik kütüphaneleri, pek çok konu üzerinde birçok tahsis ile uğraşırken geleneksel tahsis edicilerden çok daha hızlı olan iplik önbellekleme tahsis edici sağlar.

Şimdi, birçok kişi JIT’deki gelişmeler ve JIT’in daha fazla bilgiye sahip olduğu hakkında konuşacak. Tabii, bu doğru. Ancak, bir C ++ derleyicisinin çekebileceği şeye uzaktan bile yaklaşmıyor, çünkü derleyicinin, son programın çalışma zamanı açısından sınırsız bir zaman ve çalışma alanı vardır. JIT'in programınızı en iyi şekilde nasıl optimize edeceğinizi düşünerek geçirdiği her döngü ve programın yürütmek için harcamadığı ve kendi bellek ihtiyaçları için kullanamadığı bir döngüdür.

Ek olarak, derleyici ve JIT optimizasyonlarının belirli optimizasyonları kanıtlayamadığı zamanlar da olacaktır - özellikle kaçış analizi gibi durumlarda. C ++ 'da, değer yine de yığında olduğundan, derleyicinin bunu gerçekleştirmesi gerekmez. Ayrıca, bitişik hafıza gibi basit şeyler vardır. C ++ 'da bir dizi tahsis ederseniz, o zaman tek ve bitişik bir dizi tahsis edersiniz. Java'da bir dizi ayırırsanız, o zaman hiç bitişik değildir, çünkü dizi yalnızca herhangi bir yere işaret edebilecek işaretçilerle doldurulur. Bu sadece çift indirmeler için bir bellek ve zaman yükü değil, aynı zamanda önbellek ek yükü için de geçerlidir. Bu tür bir şey Java'nın dil anlambiliminin basitçe eşdeğer C ++ kodundan daha yavaş olması gerektiğini zorlamasıdır.

Sonuçta benim kişisel deneyimim, Java'nın ortalama olarak C ++ hızının yarısı kadar olabileceği yönünde. Bununla birlikte, temelde farklı algoritmalar nedeniyle, performans tablolarını son derece kapsamlı bir kıyaslama paketi olmadan yedeklemenin gerçekçi bir yolu yoktur.

b. Java kullanarak modern bir AAA başlığı oluşturmak mümkün müdür?

Sanırım burada "oyun" demek ve bir şans değil. Öncelikle, mevcut tüm kütüphaneleri ve altyapı hedefini C ++ olarak sıfırdan her şeyi kendiniz yazmak zorunda kalacaksınız. Kendisini imkansız kılmamakla birlikte, kesinlikle olanaksızlığa kesinlikle katkıda bulunabilir. İkincisi, C ++ motorları bile mevcut konsolların minik hafıza kısıtlamalarına pek uymuyor - eğer JVM'ler bu konsollar için bile mevcutsa ve PC oyuncuları hafızaları için biraz daha fazlasını bekliyorlar. Performanslı AAA oyunları oluşturmak C ++ 'ta yeterince zor, Java ile nasıl başarılabileceğini anlamıyorum. Hiç kimse hiç derlenmemiş bir dilde geçirdiği önemli bir zaman ile bir AAA oyunu yazmadı. Bundan daha fazlası, sadece son derece hataya açık olurdu. Deterministik yıkım, örneğin GPU kaynakları ile uğraşırken ve Java’da

c. Java hangi alanlarda özellikle C ++ 'dan daha yavaştır? (örn. Sayı-ezme, grafik veya hemen her yer)

Kesinlikle her yere giderdim. Tüm Java nesnelerinin zorunlu referans niteliği, Java'nın C ++ 'dan çok daha fazla dolaylı ve referanslı olduğu anlamına gelir; örneğin daha önce dizilerle verdiğim bir örnek, aynı zamanda tüm üye nesneler için de geçerlidir. Bir C ++ derleyicisinin bir üye değişkeni sabit sürede aradığı durumlarda, bir Java çalışma zamanı başka bir işaretçiyi izlemelidir. Ne kadar çok giriş yaparsanız, o kadar yavaş sonuçlanır ve JIT'nin yapabileceği hiçbir şey yoktur.

C ++ 'ın bir parçayı neredeyse anında serbest bırakıp yeniden kullanabileceği durumlarda, Java'da koleksiyonu beklemelisiniz ve umarım bu parça önbellekten çıkmaz ve doğal olarak daha fazla bellek gerektiren daha düşük önbellek ve çağrı performansı anlamına gelir. Sonra boks ve unboxing gibi şeyler için semantics bakın. Java'da, int'ye başvuru yapmak istiyorsanız, dinamik olarak ayırmanız gerekir. Bu, C ++ anlambilimine kıyasla doğal bir atık.

O zaman jenerik problemin var. Java'da, genel nesneler üzerinde yalnızca çalışma zamanı devralma yoluyla işlem yapabilirsiniz. C ++ 'da şablonlar tam anlamıyla sıfır ek yüke sahiptir - Java eşleşemez. Bu, Java'daki tüm genel kodların doğal olarak C ++ 'daki genel bir eşdeğerden daha yavaş olduğu anlamına gelir.

Ve sonra Tanımsız Davranış'a geliyorsun. Herkes programları UB'yi sergilediğinde nefret ediyor ve herkes bunun olmasını istemiyor. Bununla birlikte, UB, Java'da asla bulunamayacak optimizasyonları temel olarak sağlar. UB'ye dayalı optimizasyonları açıklayan bu gönderiye bir göz atın . Davranışın tanımlanmaması, uygulamaların daha fazla optimizasyon yapabileceği ve C ++ 'da tanımlanmamış ancak Java'da tanımlanmış koşulları kontrol etmek için gereken kodu azalttığı anlamına gelir.

Temel olarak, Java anlambilimi, C ++ 'dan daha yavaş bir dil olduğunu belirtir.

Java şimdi derlenmiş bir dil mi yoksa yorumlanmış bir dil mi?

Bu iki gruba da hiç uymuyor. Derlenmiş bir dilden çok daha fazla yorumlanmış bir dil gibi olduğunu söylememe rağmen, yönetilenlerin gerçekten kendi başlarına ayrı bir kategori olduğunu söyleyebilirim. Daha da önemlisi, hemen hemen sadece iki büyük yönetilen sistem var, JVM ve CLR ve “yönetilen” derken yeterince açık.

Java'nın ilk günlerden beri ele aldığı bazı önemli eksiklikler nelerdir?

Otomatik boks ve unboxing bildiğim tek şey. Jenerikler bazı problemleri çözerler ancak pek çoğundan uzaktırlar.

Java'nın henüz ele alınmaması gereken bazı önemli eksiklikler nelerdir?

Jenerikleri çok, çok zayıf. C # 'in jenerikliği oldukça güçlüydü - elbette, pek de şablonlar değil. Deterministik yıkım, diğer bir büyük eksikliktir. Herhangi bir lambda / kapatma şekli de büyük bir sorundur - Java'daki işlevsel bir API'yi unutabilirsiniz. Ve elbette, onlara ihtiyaç duyan bölgeler için her zaman performans sorunu var.


10
Modern JIT'lerin nasıl çalıştığı hakkında bazı yanlış anlamalar var gibi görünüyor. Aksi takdirde iyi bilgi.
Sean McMillan

7
"Daha da önemlisi, hemen hemen sadece iki büyük yönetilen sistem var, JVM ve CLR" - Python? Yakut? Smalltalk? LİSP ? Hepsi çöp toplayıcıları kullanıyor, işaretçi aritmetik eksikliği ve AFAIK, bayt koduna dayalı en az bir uygulamaya sahip.
Michael Borgwardt

3
@Michael: En son kontrol ettiğimde, en azından Python ve Ruby ağır bir şekilde "yorumlanmış" kampa düştü. En yaygın uygulamaları, ayrı bir aşamada bytecode için önceden derleme yapmaz ve JIT'leri de dahil etmez. Smalltalk veya LISP kullanılmadı, ancak onları "büyük" kampa koymak konusunda emin değilim - ve bir Smalltalk veya LISP JIT'i de hiç duymadım.
DeadMG

19
+1 güzel cevap. Sonunda Java'nın neden C ++ 'dan daima daha yavaş olacağını anlayan biri.
jeffythedragonslayer

2
Bu noktalardan herhangi biri gerçek dünya performans sorunlarından herhangi birini içeriyor mu (accexdotal veya benchmarked)? Çoğu kullanıcı tarafından farkedilebilir mi? X dilinin Y diline göre% 0.25 daha hızlı olduğunu söylemek, Y dilinin yavaş olduğu anlamına gelmez. Video oyunlarında, sert konsollardan mı bahsediyorsunuz yoksa PC oyunları da var mı?
TheLQ

34

Programlama dilleri hakkında gerçekten tarafsız bir fikir vermenin herkes için neredeyse imkansız olması şartıyla başlayacağım. Onlara anlamlı bir şekilde yorum yapacak kadar iyi iki dil biliyorsanız, bir diğerine tercih etmeniz neredeyse kaçınılmazdır. Adil bir uyarı olarak, şüphesiz yorumlarımı en azından bir dereceye kadar etkileyen Java'yı C ++ ile tercih ediyorum.

1 A. Hız: C ++ veya Java'dan aldığınız hız genellikle, dile veya uygulamanın programcı (ların) becerisini kullanmasına göre daha az olacaktır. Sonuçta, C ++ muhtemelen olabilir çoğu zaman daha hız için kazanmak, ama yazdığınız kod farklılıklar gerçekten önemli şeylerdir.
1b. Evet muhtemelen. Aynı zamanda, C ++ zaten iyi kurulmuş ve çoğu oyun stüdyosunun Java’ya geçiş yapmak için yeterli avantaj sağladığından şüpheliyim.
1c. Bunun tam bir cevabı muhtemelen büyük bir hacmi doldurabilir. C ++ genellikle daha sınırlı kaynaklarla daha iyi sonuç verir. Java, (örneğin) çok fazla "boş" belleğe sahip olmasından daha fazla fayda sağlar.
2. Yavaş yürütme ve yavaş çöp toplama muhtemelen en belirgin ikisi olacaktır. Erken pencereleme kütüphanesi (AWT) oldukça hantaldı - Swing önemli bir gelişme oldu.
3. Ayrıntı. Operatör aşırı yükleme eksikliği. Çöp toplamanın kullanımı. Çoklu kalıtım eksikliği. Java Generics, C ++ şablonlarına göre oldukça sınırlıdır.

Bu dezavantajların bazılarının (hepsinin?) (Özellikle çöp toplamanın kullanılması, ancak diğerleri de) Java tarafından pek çok kişi tarafından görüldüğünü eklemeliyim. Tek olası istisna, ayrıntılarıyla olur. Ayrıntı durumu yavaş yavaş biraz iyileşiyor, ancak kesinlikle Java kazanan kod golf yarışmalarının çok sık görülmediğini ve sıradan kodda da oldukça fazla kod kullanma eğiliminde olduğunu görüyorsunuz. Sanırım daha okunaklı ve anlaşılır görünen en az sayıda kişi olduğundan şüpheleniyorum, bu yüzden muhtemelen bir avantaj olarak da görülebilir.


12
Java jenerikleri C ++ şablonlarıyla bile karşılaştırılamaz. Java şablonları, derleme zamanı tür denetimine yardımcı olmak için sözdizimsel bir şekerdir. C ++ şablonları bir Turing-komple kod üretme sistemidir.
kevin cline

10
Ayrıntı için +1. Uzun sargısız anlamsız sözdizimi için COBOL ile orada. Tüm "try" "catch" ile ve hepsi ile e ExtrementlyLongClassName extremelyLongObjectName = new ExteremlyLongClassName () tip kodu, bir kod parçasının gerçekte ne yapmaya çalıştığını çözmek için oldukça zor olabilir.
James Anderson

1
@Mark: şahsen, bu cevabı okunamayan bir karışıklık buluyorum ve bu tür şeyleri tekrar görmemek istiyorum. Cevaplar tartışmalar değil cevaplar olmalıdır.
Michael Borgwardt

2
+1 Operatör aşırı yüklemesi için, birçok insanın küçük dezavantaj olarak gördüğü, ama benim için büyük olanı. Ve elbette şablonlar, fakat neredeyse herkes onları büyük olarak görüyor.
Christian Rau

2
C ++ şablonlarının Turing-complete olması amaçlanmamıştır - bu, tasarımın bir sonucu olarak kazara oldu. Bununla birlikte, zaman zaman kullanışlıdır: C ++ şablon metaprogramlamasını arayın.
fırtına

11
  1. Performans ile ilgili olarak;
    1. Saf kod yürütme hızında Java, basit C ++ 'a eşittir. Fakat Java, çok daha fazla bellek kullanma eğilimindedir - kısmen GC tabanlı olduğundan, kısmen tasarımı verimlilikten ziyade sadelik ve güvenlik üzerine odaklanır. Önbellek sorunları nedeniyle, daha fazla bellek daha düşük hıza dönüşür. Bir çok düşük yüksek ayarlı C ++ ile karşılaştırıldığında arttırılmıştır.
    2. Bir AAA başlığının geçerli donanım kullanılarak mümkün olanın kenarında çalışması gerektiğini varsayıyorsanız, hayır. En azından müşteri tarafında değil. Bazı AAA başlıklarının zaten arka uç altyapısının parçaları için Java kullandığına bahse girerim.
    3. Büyük veri kümeleri ve C ++ ile çalıştığınız her şey, önbellek dostu bir şekilde erişmek için en iyi duruma getirilebilir.
  2. Çalışma zamanında bytecode ve JIT-compiled derlenir. Derlenmiş ve Yorumlanan yanlış, modası geçmiş bir ikiliktir.
  3. & 4. Hepsini listelemek için çok fazla şey var ve çoğu üzerinde anlaşmazlık olacak.

3
GC tabanlı neredeyse bir demek gibi bir çünkü söyleyen Java çok fazla bellek kullanır 18 tekerlekli bunun 18 tekerleği var çünkü gazın bir çok kullanır. Java hakkında hiçbir şey bilmiyorum ama sorunun çalışma zamanı şişmesi ve çok fazla şeyin önbelleğe alınmasından, daha az anlamsal çöp olduğundan ve çöp toplama yaklaşımının kendisinde bir kusur olmamasından şüpheliyim .
Joey Adams

3
En belirgin düzeyde, çöp toplama, kullanılmayan bir nesne ile çöp toplayıcıyı kendi alanını geri kazanma arasında bir gecikme olduğu anlamına gelir. El ile yönetilen bir ortamda, nesne kullanımdan çıktığında alan derhal serbest bırakılabilir. Gecikme, çöp toplanan ortamın daha fazla bellek kullandığı anlamına gelir. Tipik olarak GC yükü azalttığı için kullanabileceği daha fazla bellek kullanır.
Michael Borgwardt

1
@MichaelBorgwardt Çoğu JVM'nin her seferinde sıfırdan başlaması gerektiği için hızın zamana ihtiyacı olduğunu belirtmek isteyebilirsiniz. Önceki çalışmalardan gelen profil bilgileri yeniden kullanılmaz.

11

Öncelikle, bazı bağlamlar, benim C ++ 'ım çok paslı, bu yüzden Java ile olan deneyimlerimin çoğu, yine de elmaları karşılaştırmak için çok daha fazla elmalar olan C # ile daha yakın deneyimlerim ile ilgilidir.

1. Hız

a. Java'nın bugünkü hızı C ++ ile karşılaştırıldığında nasıldır?

Bence bu en iyi SO sorusu tarafından cevaplandı: Java neden yavaş olma ününe sahipti? Ancak bu sorunun tümünün Jeff Atwood'un blog yazısı Gorilla vs. Shark tarafından da renklendirildiğini düşünüyorum . Péter ve Christopher'a teşekkürler.

b. Java kullanarak modern bir AAA başlığı oluşturmak mümkün müdür?

Bu, geliştiricilerin öncelikleri ve geliştiricilerin becerilerine bağlıdır. Ayrıca bu durum bir / veya durum değildir, başlığın farklı bölümleri, uygulandıkları dilin farklı şeylerini gerektirebilir ve bu da türdeş olmayan bir dil ortamına yol açabilir.

Geçenlerde bir Python ortamını yüklerken yüklerken bahsettiklerini belirten bir kaç oyun gördüm ve tatil sezonu için vaktinizi çıkarmak istiyorsanız (örneğin) kurslar için atların güçlü bir motivasyon olduğunu düşünüyorum. .

c. Java hangi alanlarda özellikle C ++ 'dan daha yavaştır? (örn. Sayı-ezme, grafik veya hemen her yer)

Düşük performanslı kodları herhangi bir dilde yazabilirsiniz, ancak bazı diller iyi seçimler yapmayı kolaylaştırırken, bazılarının kendi kulağınıza göre yükselmesine izin verme olasılığı daha yüksektir . Java eski kategoriye giriyor, C ++ kesinlikle ikinciye giriyor.

Büyük bir güçle dedikleri gibi büyük sorumluluk gelir (öbeklerinizi tamamen bozma yeteneğinden bahsetmeden * 8 ').

2. Java şimdi derlenmiş bir dil mi yoksa yorumlanmış bir dil mi?

Çoğu insanın ne düşündüğünü söyleyemem , ancak çoğu insan derlenmiş ve yorumlanmış diller arasındaki farkı bilir ve son 20 yıldır bir mağarada yaşamamış, JIT’in de bileceğini bilirdi . -Time ) derleyici, Java ekosisteminin önemli bir parçasıdır, bu nedenle bu günlerde derlenmiş olması muhtemeldir.

3. Java'nın ilk günlerden beri ele aldığı bazı önemli eksiklikler nelerdir?

Java'ya oldukça yeni bir dönüşüm yapıyorum, bu yüzden nasıl geliştiği konusunda çok az içeriğim var. Ancak, Java gibi kitaplar bulunduğunu not etmek ilginçtir : İnsanları bugünlerde tercih edilmesi gereken dilleri yönünde yönlendirmek ve insanları olması gereken alanlardan uzaklaştırmak isteyen İyi Parçalar. kullanımdan kaldırıldı.

4. Java'nın henüz ele alınmaması gereken bazı önemli eksiklikleri nelerdir?

Aklıma, Java ile ilgili bir sorun, yeni özelliklerin yavaş yavaş benimsenmesi olmuştur.

Java’ya C # dan gelmiş ve Wikipedia karşılaştırma sayfasına bakıp , benim için öne çıkan şeyler:

Java'da özlediğim şeyler, C # ile karşılaştırıldığında

  • Özellikler , özellikle otomatik özellikler. Arayüz oluşturma ve sürdürmeyi çok daha kolaylaştırırlar.
  • Kapaklar / lambdalar . Java desteğinin tekrar zorlandığını duyduğumda gerçekten hayal kırıklığına uğradım . Sonunda Java 8'de Closures / lambdas'ımız var, ancak geçen süre yavaş evlat edinme konusundaki açıklamamı onaylıyor.
  • Type inference ( var), sözdizimsel şeker gibi görünebilir, ancak karmaşık genel türleriniz olduğunda, birçok değersiz çoğaltma işlemini kaldırarak kodu daha net hale getirebilir .
  • Kısmi sınıflar, otomatik olarak oluşturulan kodu (bir GUI oluşturucusundan yazarak) programcının yazılı kodundan ayrı tutmaya gerçekten yardımcı olur.
  • Değer türleri , bazen structtam bir sınıfın üzerindeki hafif kullanımı için bir argüman vardır .
  • Uzatma yöntemleri kullanılan aşırı eğer sistem karmaşık hale ancak bir sınıf için bir şey uygulanmasının kanonik yolu göstermek için mükemmeldir olabilir eğer o ihtiyaç vardır.
  • İmzasız türleri , bazen bu ekstra bit tüm farkı yaratabilir. * 8' )

Yapılacaklar ben yok C # ile karşılaştırıldığında, Java özledim

  • Operatör aşırı yüklenmesi , doğru kullanıldığında çok iyidir, ancak kötü kullanıldığında, hata bulmak zor olabilir ve bir operatörün açıkça yapması gereken ile gerçekte ne yaptığı arasında bağlantı kopmasıyla sonuçlanabilir .
  • Null değerlerinin her zaman değerlerinden daha fazla belaya neden olduğu görülüyordu.
  • Koda erişim unsafe. Bu konuda o kadar dikkatli olmalısınız ki, ekstra çabaya değecek nadiren buldum.

Dolayısıyla, elmaları elmalarla karşılaştırırken bile, Java'nın geride kaldığı düşünülmektedir.

Java ile gördüğüm diğer iki büyük problem, korkunç başlangıç ​​gecikmesi ve (bazı JVM'ler için) öbeklerinizi ve hatta kalıcı nesil öbeklerinizi mikro yönetmeniz gerektiği gerçeği . C # uygulamaları her zaman hemen başladı ve sanal makineye atanmış önceden tahsis edilmiş bir havuzdan değil, sistem bellek havuzundan tahsis edildiğinden hiçbir zaman yığın hakkında düşünmek zorunda kalmamıştım.


1
Bağladığın SO sorusu, kabul edilen cevap inanılmaz, çok yanlış.
DeadMG


@Mark: Belki de. Sonra tekrar, muhtemelen tamamen bırakmak için iyi. Aynı soruyu kendi cevabımda söylediklerimi zaten yaptım, bu yüzden yorumlara daha fazla şey eklemek gerçekten çok fazla yeni bilgi eklemek için olası değildir.
Jerry Coffin

8

Sorunuzun ilk bölümünü sizin için cevaplamaya yardımcı olabilecek bir kaynağı size gösterebilirim. Programlama dilleri http://shootout.alioth.debian.org/u64q/which-programming-languages-are-fastest.php , dillerin birbirleriyle ne kadar hızlı karşılaştırıldığını görmek için oldukça iyi bir kaynaktır. Dillerin hangi bölgelerde diğerlerinden daha iyi olduğunu görmek için farklı kategorilerde bile filtrelenebilirler. Java birkaç yıl önce olduğundan daha hızlıdır.



Evet, muhtemelen doğrudan bu sayfaya bağlantı vermeliydim.
bschaffer13

4

1) Kesinlikle Java ile aldığım UX hakkında konuşmak yavaş geliyor. Neden olduğunu gerçekten söyleyemem. Java tabanlı bir masaüstü uygulamasına rastlamadım, bu yavaş hissetmiyor ve daha hızlı bir Java dışı alternatifi var. Olduğu söyleniyor, Java saf hesaplama hızında çok hızlı olabilir ve internet bunu kanıtlamak için ölçütlerle doludur. Bununla birlikte, Java uygulamalarının önyükleme süresi ve GUI'lerinin duyarlılığı henüz IMHO'yu iyileştirmedi. Belki yapabilirsin;)
Sonunda, hız çok fazla bir sorun değil. Yalnızca donanım daha hızlı ve daha hızlı hale gelmekle kalmaz, aynı zamanda çoğu insan, yazılım yaptığı sürece ne yapması gerektiği, ne yapması gerektiği ve etkileşimde bulunmak için harcanan zamanın karşılığını beklemek için şaşırtıcı bir şekilde çok az şey umursadığıdır.

2) Bu ayrım son zamanlarda çok bulanıklaştı, bunun için çok az değer var.

3 + 4) Java'da aslında bazı değişiklikler oldu. Bazı insanlar zaten, bu değişikliklerin Java'nın tamamen basit felsefesini yabancı özellikleri öne sürerek belirttiğini iddia ediyor. Objektif olarak söylemek, bir eksikliğin ne olduğunu ve ne kadar güçlü olduğunu söylemek gerçekten zor. Bana göre Java, gereksiz yere ayrıntılı, kısıtlayıcı ve özellikleri zayıf, diğer insanlar ise bu özellikleri hoş olmayan bir belirsizlik, güvenlik ve açıklık olarak kabul ediyorlar.
Bu yüzden, kişisel olarak Java kullanmamamı sağlayan şeyler olsa da, Java'da özlediğim şeyleri eklemenin iyi bir fikir olduğunu sanmıyorum. JVM'de çalıştırmaktan ve Java'yı kendilerine daha yakın olması için bükmekten hoşlandığım pek çok dil var.

Bu bir tercih meselesi

Java ile olan şey, kendinizi ayağınızdan vurmanızı engellemek için tasarlanmış olmasıdır. Asil bir sebep, ancak size bağladığı tüm kısıtlamalarla, güvenli ayaklarınızdan birinin üzerinde seyahat etmeniz, ellerinizin arkanıza bağlanması ve kendi güvenliğiniz için ellerinizin arkasına bağlanmasıyla kendinizi bağlayamazsınız. çünkü kafanı kırdın. : D
Bir anlamda Java, C ++ 'a verilen bir cevaptı, bu size sadece kendinizi asmak için değil, dünyanın geri kalanını da asmak için yeterli ipi verdi. Kovboylar için çok çekici kılan tüm ip. Bütün bu özgürlük ve bütün bu güç.

Yani basitçe söylemek gerekirse, bu gerçekten sadece bir tercih meselesidir.

Ancak bir nokta, C ++ ile Java'ya alternatif olarak, kendi kısıtlamalarınızı seçmekte özgürsünüz. Veya tüm kontrolünüzle gerçekten çıldırmak, akranlarınızı tamamen karıştırmak tehlikesiyle karşı karşıya:

"Cout" un "Merhaba dünya" zamanını sola kaydırdığını ve orada durduğunu gördüm.
- Steve Gonedes

Java, bu nedenle operatöre aşırı yüklenmeyi teklif etmedi. Elbette bu, işlev işaretçilerini listelerle çarparak insanların kodlarını gizlemelerini önler. Fakat aynı zamanda diğer insanların normal operatörlerle geometrik / cebirsel hesaplamaları yapmasını önler. (v1 * v2 / scale) + (v3 * m)gerçekten çok daha net v1.multiply(v2).divide(scale).add(v3.multiply(m)). Bunun neden 3B grafikler ve hesaplamalarla uğraşan insanları engelleyebileceğini anlıyorum.

Java, çöp toplama empoze etmeyi seçti, oysa C ++ 'ı seçebilirsiniz. Gerçekten tüm yolu kazıp donanıma yaklaşabilirsiniz. Verileri yoğun biçimde yapılara paketleyebilirsiniz. Hızlı ters kare kökü gibi kara büyüleri gerçekleştirebilirsiniz . Şablonları kullanarak yeryüzünde en karmaşık ve şifreli metaprogramlamanın bazılarını gerçekleştirebilirsiniz. Ama aynı zamanda, kaybolabileceğiniz ve yarattığınız tüm karışıklığı ayıklamak veya kesinlikle yararsız bir derleyici hataları incelemek için saatler harcayabileceğiniz anlamına gelir.
Ancak, yalnızca ana dilde kullandığınız dilin bölümlerini kullanma disiplinine sahipseniz, C ++ kodunu Java kodu kadar güvenli bir şekilde yazabilirsiniz, ancak kademeli olarak ileri itme seçeneğiniz vardır.

Bu yüzden teknik olarak hiçbir şey size Java ile son teknoloji yazılımlar yazmanızı engellemezken, birçok geliştiricinin harika bir yazılım yazmak, eğlenmek ve eğlenmek konusunda gerçekten tutkulu olduklarını keşfedeceksiniz.

Ancak dünya yalnızca ortaya çıkan insanlardan oluşmuyor, bir sonraki büyük şeyi yaratıyor veya yalnızca kendilerine verilen gücün kullanımını yalnızca kontrol ettikleri kadar kısıtlayacak olan insanları yaratıyor . IMHO Java, rahat bir şekilde istikrarlı sonuçlar elde etmek isteyenler için mükemmel bir seçimdir.


+1 C ++ 'da hiçbir şeyin Java benzeri kod yazmanızı engellemediği ve aynı şekilde hiçbir şeyin sizi bundan daha fazlasını yapmasını engellemediği için. Bir dili güvensiz veya zor yapan programcıdır.
Christian Rau

0

Çöp toplama büyük şey. Her zaman, GC birkaç yüz milisaniye boyunca (yığının boyutuna bağlı olarak) her şeyi kilitler ve büyük bir toplama yapar. Herhangi bir zamanlama sınırlamanız yoksa, bu iyi bir şeydir, ancak geç kalmak demek başarısızlık demektir, bu bir şovdur. Parayı gerçek zamanlı Java ve gerçek zamanlı işletim sistemi için harcayabilirsiniz, ancak GCC'yi ve standart Linux'u kullanabilir ve bu sorunlarla karşılaşmazsınız.

Tahmin edilemeyen rastgele duraklamalar olmadan, Java muhtemelen bugünlerde pek çok şey için yeterince hızlı. Ve GC ayarlarınızı ayarlayarak aylar geçirirseniz ve bunun gibi, belki, sadece belki, müşterinin sizi kontrol etmesini sağlayacak kadar uzun süre çalışmasını sağlayabilirsiniz.


Çoğu modern çöp toplayıcı dünyayı durdurmaz.

-1

3) Düzeltilen eksiklikler.

Birkaç yıl önce Java'da çok fazla öfke vardı. Java programcılarının çoğu web / sunucu programcılarıdır ve Java'nın ayrıntılarıyla çıldırıyorlardı. Böylece Ruby gibi bazı diller popüler oldu ve Java zayıflamaya başladı. Ancak, kış uykusu ve Bahar gibi yeni ek açıklamalar ve çerçevelerle insanlar şikayet etmeyi bırakıp Java'ya geri döndü.

4) Mevcut eksiklikler

Donanımın hepsi çok çekirdekli gidiyor. Her ne kadar Java çoklu okuma yapabilse de, sıralı bir dil olan C'yi temel alır ve en az okunması için işlevsellik zarif değildir. Bu arada, bu sadece bir Java eleştirisi değil, hemen hemen bütün dillerin. Kod hakkında tamamen farklı bir düşünce tarzına ihtiyaç var. Belki de fonksiyonel programlama geleceğin yoludur.


1
Delirmek? Öyle sanmıyorum. Ve görünüşe göre Java 6'daki eşzamanlı şeylere hiç

-1

Bu soruya biraz tepki verdim çünkü yanıltıcı ve büyük oranda alakasız cevaplar verecek:

b. Java kullanarak modern bir AAA başlığı oluşturmak mümkün müdür?

Herkes, AAA başlıklarının Java kullanarak üretilmesinin zor olacağını ve benim bildiğim hiçbir gerçek örnek olmadığını kabul edebilir. Bununla birlikte, AAA'nın bir çok şeyi üstlenecek niteliği göz önüne alındığında ( pazarlamadan gelen kafa karıştırıcı bir terim olduğu için ) bunun yerine aşağıdakileri sormak daha iyidir:

Java kullanarak makul bir başarı ile modern bir başlık oluşturmak mümkün mü?

Cevabı " Evet, yapabilirsin. " Bununla birlikte, denklemin asıl başarı kısmı daha fazla sebat ve şansınıza (veya zeitgeist'e bağlılığınıza) dayanıyor ancak bu, bu sitenin kapsamı dışında.


-6

Bir certian hız alanı derleyici vs derleyici aşağı gelir. Dil-dil değil. JIT derlemesinin avantajları olabilir, çünkü üzerinde çalıştığı makinenin teknik özelliklerini optimize edebilir. Daha fazla "elmadan elmaya" derleyici karşılaştırması için JIT'den derlenen C ++ ile Java'yı karşılaştır.

Fakat Java dilinin kendi performansını sınırladığı bazı şeyler var.

  1. yığında tahsis. Java bunu yapamaz. Özyinelemeli olmayan bir çözümde küçük sabit boyutlu sınıflar için bu genellikle idealdir. Yığın parçalanmasını da önleyebilirsiniz.

  2. sanal olmayan işlevler. Java bunu yapamaz. Tüm yöntem çağrıları geçersiz kılmaları planlanmadığında bile kalıcı bir isabet alır.

Muhtemelen başka şeyler ama kafamın üstünden düşünebildiğim tek şey bu.


2
Modern JIT derleyicileri bu iki durumu da optimize edebilir. Java (6'dan itibaren) yığın tahsisine sahiptir: en.wikipedia.org/wiki/Escape_analysis . Sanal olmayan işlevlere gelince, JIT derleyicisi yalnızca bir hedefe giden (ve bazen hatta satır içi) sanal olmayan aramalara giden sanal yöntem aramalarını çözecektir.
Steven Schlansker

1
# 2 sahte: herhangi bir JIT işareti, şu anda geçersiz kılınmalarına bağlı olarak sanal veya sanal olmayan işlevler görür .
amara

-16

1) alakasız ve önyükleme yapmak için tartışmacı.
Java'da yalnızca büyük yazılım parçaları yaratılmasının yanı sıra, bu tür sistemler her gün teslim edilir ve dünyadaki çoğu büyük şirketi yönetir.
2) aynen.
JVM spesifikasyonunu okuyun, bilirsiniz. Java hiçbir zaman tercüme edilmiş bir dil değildi.
3) aynen.
15 yıllık sürüm notlarını okuyun. Neyin "büyük kusurlar" olarak ele aldığını düşündüğünüzü anlamamız imkansız.
4) aynen.
Ele alınması gereken en büyük kusur, ana dilin ve kütüphanelerin başka bir görünür sebep olmaksızın karışmasına eğilimli olan JCP'dir; JSR-666’nın lideri ". Umarım Oracle’ın JCP’yi yeniden yapılandırması bununla ilgilenir.
Burada sadece bir dil savaşını körüklemek ve Java tarafından önyargınızı başkaları tarafından onaylatmak istiyor gibisiniz, çünkü bunun için gerçek bir gerekçe bulamazsınız.


ah, insanlar zaten Java’yı kandırmayacak birini düşürerek savaşları başlatıyorlar. Aferin millet!
10'da

10
Bence, aşağı yönlü oylamaların sebebi, cevabınızın gerçekten bir olmadığı gerçeğidir.
blubb

6
Bu cevap sadece trolling. OP'nin iyi, iyi düşünülmüş, azgın bir sorusu vardı. O zaman "Java'ya karşı önyargınızı başkaları tarafından onaylanmasını sağlayın, çünkü bunun için gerçek bir gerekçe bulamazsınız". Evet, -1. Oh ve hayır, Java'dan nefret etmiyorum, birçok şey için şu anki favori dilim
TheLQ

4
OP, oldukça iyi bir araya getirilmiş bir soru yazdı ve iyi ifade edilmiş cevaplar aldı. Onu bir şey karıştırmakla suçlamak gerçekten gerekmiyor.
Adam Lear

ah, savaşlara zaten rantlar için ciddi sorular (ve cevaplar) alarak ve şahsen kendilerini saldırıya uğradıklarını hissederek başladığını görüyorum. Çok kötü, henüz oy kullanamıyorum.
Christian Rau
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.