Çok miktarda RAM gerektiren uygulamalar için C ++ veya Java'yı seçin? [kapalı]


11

Çoğunlukla işlemci bağlantılı ve yığın kullanımında (en az birkaç gigabayt) ağır olan bilimsel uygulamaları düşünüyorum. Yılın herhangi bir zamanında mutlu bir şekilde C ++ ile giderdim, ancak bu durumda C ++ bellek yöneticisine doğal olan parçalanmanın Java'nın sıkıştırıcı koleksiyoncularının avantajına karşı ciddi bir sorun olup olmadığını merak ediyorum.

Herkes bununla ilgili gerçek dünyadaki örneklere işaret edebilir mi?


Bu durumda dilin programlama kadar önemli olduğunu düşünmüyorum. Herhangi bir olgun dil muhtemelen hesaplamanızın ölçeğine bağlı olarak işe yarayabilir. Bu role girebilen Javas, C / C ++, hatta Pythons ve Rubies var. Bazıları diğerlerinden daha zor olurdu, çünkü gerçekten hafızada sızmadığınıza dair kesin bir güvenceye sahip olmanız gerekir.
Rig

2
7,99 $ için bir GB alabilirsiniz, bu bir sorun mu? Kingston 1GB DDR3
Bo Persson

2
@BoPersson, tecrübelerime göre, bu tür problemleri olan insanlar, üst düzey anakartlarını tamamen doldurarak başlıyorlar ve oraya istedikleri kadar koyamadıklarından şikayet ediyorlar ve sonra yönetilebilir kadar büyük veri kümesini besliyorlar ve bu yeterli değil.
AProgrammer

@dsign, anakartın 1000 € 'dan daha az yüzlerce bellek kabul etmesini sağlayabileceğiniz bu günlerde, birkaç konser bellek kullanımında ağır değildir.
AProgrammer

1
Ucuz hafıza kısmı ile aynı fikirde. Gelişim gelince, bir süredir C ++ kullanıyorum ve iyi kodlama uygulamaları sızıntıları oldukça nadir bir fenomen haline getiriyor; Aslında bu konuda C ++ 'ı java yerine tercih ediyorum.
12'de dsign

Yanıtlar:


11

Makinenin sınırlarını vurgulamak zorunda olan bir uygulamadan bahsediyorsanız , bu sınırları aşmamak için programlama hileleri yapacağınızı beklersiniz, o zaman C ++ gitmenin yoludur. Sadece C ++, Java'nın olmadığı (Emilio'nun işaret ettiği gibi) optimizasyon için değil, aynı zamanda Çöp Toplayıcılar, verimli çalışmak için bol miktarda ekstra boş belleğe ihtiyaç duyan çok fazla bellek aç çelişkileri.

Bu sorunun yanıtları: StackOverflow: Çöp toplama için ne kadar fazla bellek gerekir ? oldukça korkunç bir resim çizin, ancak çöp toplayıcıların boş hafızaya sadece ayrılan hafıza kadar ( hatta duyduğum kadar) olması gerekse bile , bu hala Java ile hala çok fazla boş hafızaya ihtiyacınız olacağı anlamına gelir. verimli çalışması için.

Öte yandan, günümüzde, donanımın sınırlarını aşmamak için programlama hileleri yapmak yerine genellikle daha pahalı donanım satın almayı tercih ediyoruz. Sizin durumunuzda, RAM sorunlarınız genellikle 64 bitlik bir makine kullanarak ve gerektiği kadar RAM modülü atılarak çözülür. Görüyorsunuz, donanım maliyeti günümüzde gelişmiş dünyada geliştirme süresinin maliyetine yakın değil.

Bu seçeneği ciddiye almanız gerektiğini düşünüyorum ve mümkünse, bu seçenekle ve C ++ yerine Java ile devam edin, çünkü Java'da bir şey geliştirmek için C ++ 'dan çok daha kolay ve daha sonra devam ettirmek daha kolaydır.


Cevabınız için teşekkürler. Donanım illüstrasyonunuza katılıyorum.
12'de dsign

Çöp toplama çalışırken programın duraklatılmasını umursamıyorsanız, bellek gereksinimleri çok daha küçüktür.

1
Son paragrafa katılmıyorum. Java'nın geliştirilmesi C ++ 'dan daha kolay değildir. Son beş veya altı yıl içinde çok fazla C ++ ve nispeten az Java yaptığım için benim için olmazdı. Hem C ++ hem de Java'da bakım yapılabilir ve sürdürülemez kod yazmak mümkündür.
David Thornley

1
@DavidThornley 10+ yıldır C / C ++ ve 6+ yıldır Java yaptım. Java'yı her açıdan daha kolay buluyorum: prototip oluşturma, geliştirme, genişletme ve bakım. Ancak her durumda, görüşlerin yapılması gereken şey budur: farklı . C -: =
Mike Nakis

Herhangi biriniz büyük veri, işlemciye aç bir proje için programladınız mı? Orada yorum var mı?
12'de dsign

7

Sorun, Java olduğu gibi C ++ ve C ++ olduğu gibi Java kullanmamaktır. C ++ kapsayıcısı, Java ücretsiz mağazasında olduğu gibi, fazla parçalanmayı önlemek için normal olarak uygulanır.

Ancak kendinizi doğrudan belleğe ayırırsanız, Java'nın yapmanıza izin vermediği şeyleri de yapabilirsiniz, bu da parçalanmaya neden olabilir.

Uygun çözüm (C ++ ile) sabit "plekseler" (burada kilit nokta, iyi bir ayırıcı sınıf yazma) yoluyla tahsisi yöneten ayırıcı sınıfları aracılığıyla konteyner ve akıllı işaretçiler kullanmaktır. Ve bu, Java ile hiçbir ilgisi olmayan bir programlama stilidir, bu yüzden herhangi bir karşılaştırma anlamsızdır.

[EDIT] Bu eski bir örnek olabilir: Sabit ayırma


Cevabınız için teşekkürler Emilio. C ++ 'ın esnekliğinin farkındayım ve sizinle aynı fikirde olmaya meyilli hissediyorum. Sonra tekrar, bu tekniklerin başarı için kullanıldığı bazı gerçek kullanım örnekleri bilmek istiyorum.
12'de dsign

@dsign: Yayın düzenlendi, bağlantıya bakın
Emilio Garavaglia

1
Bu teknikleri daha önce kullanmıştım. Kötü performans gösteren bir uygulama, ayırıcısını bir dizi sabit blok yığını kullanacak şekilde değiştirdi. Yani 4 baytlık blok istediğinizde, sadece 4 baytlık blokları depolayan yığından geldi. 5 bayt istiyorsanız, 8 baytlık blok yığını vb. Geldi. Performans artışı (yoğun tahsis uygulamamız için) muazzamdı. Sonuç olarak iyi olmayabilir, ama çok etkili olabilir. Tüm alaşımlar sabit bloklar halinde geldiğinden sıfır parçalanma da vardı.
gbjbaanb

2

Çöp toplamanın avantajı, bir makineyi sonsuz miktarda belleğe benzetmesidir. Bu soyutlamanın mekanizması veya uygulaması, programcı olarak sizin için tamamen şeffaf olması amaçlanmıştır. Hepimiz, mekanizmanın artık program tarafından kullanılmayan belleği geri kazandığını biliyoruz, ancak bu aslında garanti edilmiyor. Programı, gerçekte kullandığından daha fazla RAM'e sahip bir makinede çalıştırırsanız, çöp toplama işlemi asla gerçekleşmeyebilir. Yine ilgisiz, çünkü programı hafızayı nasıl kullandığından bağımsız olarak yazabilirsiniz. Bellek yöneticisi, program her istediğinde daha fazla RAM ayırır ve bu tür ayırmaların her zaman başarılı olacağını varsaymanıza izin verilir. Java çöp toplanmış bir dildir ve C ++ değildir. 1

Çöp toplamanın dezavantajı, tüm soyutlamalar gibi , sızıntı eğilimi göstermesidir. Her zaman, özellikle kenar durumlarda, her zaman mükemmel çalışmaz ve muhtemelen hatalarla karşılaşırsınız. Çöp toplama algoritmasını (bir programcı olarak size saydam olması gereken) yazan kişiler, en yaygın durumlar için optimize edilmiştir ve yaygın vakalardaki sorun, asla bu kadar yaygın olmamalarıdır. Genel olarak , çöp toplayıcısının hafızayı yönetmede yapabileceğinden daha iyisini yapamazsınız. Ancak belirli durumlarda (ve yeterli miktarda zaman, enerji ve anlayış verildiğinde) mümkün olabilir. C ++ size bu esnekliği sağlar; Java bunu yapmaz.

Bunların hepsi, bir dil seçmek için standart tavsiyenin burada, belki de bu durumda kısıtlamalar göz önüne alındığında geçerli olduğunu söyledi. Proje için birincil geliştiricilere en tanıdık olan dili seçin. Açık nedenlere ek olarak (uygulamayı daha hızlı ve daha verimli bir şekilde geliştirebileceğiniz gibi), bu özellikleJava'yı programladığınız gibi C ++ programlamak son derece etkili olmayan bellek yönetimi uygulamalarına ve dolayısıyla sızıntılara ve çökmelere neden olacağından açıklamanız durumunda önemlidir. Benzer şekilde, C ++ 'da programladığınız gibi Java'da programlama yapmak size çok iyi gelmeyecektir ve çöp toplama algoritmalarının en yaygın durumlar için ayarlandığı ve ayarlandığı göz önüne alındığında, optimize edilmemiş bir program üretebilir. .

Çöp toplanan dillerde çalışmaya alışkın olan programcılar, ona karşı savaşmak yerine çöp toplayıcıya güvenmeyi öğrenirler. Çöp toplanmış bir dilde çalışıyorsanız, bunlar projenizde istediğiniz programcılardır. Olan programcılar değilçöp toplanmış bir dilde çalışmak için kullanılan bu tür "sonsuz bellek" soyutlama doğası gereği şüpheci ve çoğu zaman birçok iyi nedenleri vardır. Bu programcılar iyi olabilir, bunlar çöp toplanmış bir dilde çalışmak isteyenler değildir çünkü yolun her adımında GC'ye karşı savaşacaklar, sürekli olarak ikinci tahmin edip genellikle daha yavaş, daha az bellek verimli üretecekler kodunu diğer programcı türünden daha fazla. En iyi ihtimalle, tekerleği yeniden icat etmek için çok fazla zaman harcayacaklar, size çok para ve hatta uzun vadeli bakım maliyetlerinde daha fazla para harcayacaklar.

Ve sonra kendinize bunun gerçekten önemli olup olmadığını sormanız gerekir. Bo'nun gizli yorumunun bir gerçeğinden daha fazlası var: bellek şimdi çok ucuz, çok fazla el sıkmaya değmez. Büyük miktarlara ihtiyacınız olsa bile , bu miktarlar şu anda 10 yıl kadar büyük değil. Programcılar ve uygulama geliştirme sadece RAM ve işleme gücü satın almaktan çok daha pahalıdır. Bu, mümkün olan yerlerde ekonomiden kaçınmanız gerektiği anlamına gelmez, ancak bunu yapmak için çok fazla zaman harcamamanız gerektiği anlamına gelir.


1 Tabii ki, bu varsayım sorudaki daha derin bir kusuru vurgular. Görünüşe göre, "Java veya C ++" biraz kırmızı bir ringa balığı. Standart Java uygulaması çöp toplama sağlar ve C ++ dil standardına göre değildir, ancak C ++ için üçüncü taraf bir çöp toplayıcı kullanamamanız için hiçbir neden yoktur. Birçok şirket bu şeyleri satarak geçimini sağladı ve bazıları muhtemelen onlara ücretsiz olarak para kazandı.

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.