Wählen Sie C ++ oder Java für Anwendungen, die viel RAM benötigen? [geschlossen]

11

Ich denke an wissenschaftliche Anwendungen, die meist prozessorgebunden sind und viel Heap-Nutzung erfordern (mindestens mehrere Gigabyte). Zu jeder anderen Jahreszeit würde ich gerne mit C ++ arbeiten, aber in diesem Fall frage ich mich, ob die für den C ++ - Speichermanager natürliche Fragmentierung ein ernstes Problem gegenüber dem Vorteil der Java-Kompaktierungskollektoren sein kann.

Kann jemand auf Beispiele aus der Praxis verweisen, die damit zusammenhängen?

dsign
quelle
Ich denke nicht, dass die Sprache in diesem Fall so wichtig ist wie die Programmierung. Jede ausgereifte Sprache könnte wahrscheinlich abhängig vom Umfang Ihrer Berechnung funktionieren. Es gibt Javas, C / C ++, sogar Pythons und Rubine, die in diese Rolle schlüpfen können. Einige wären schwieriger als andere, da es so klingt, als müssten Sie wirklich sicher sein, dass Sie kein Gedächtnis verlieren.
Rig
2
Wenn Sie ein GB für 7,99 USD bekommen können, ist das ein Problem? Kingston 1 GB DDR3
Bo Persson
2
@BoPersson Nach meiner Erfahrung füllen Leute mit solchen Problemen zunächst ihr High-End-Motherboard vollständig aus und beschweren sich, dass sie nicht so viel dort ablegen können, wie sie möchten, und füttern dann einen Datensatz, der so groß wie überschaubar ist, und beschweren sich dann darüber es ist nicht genug
AProgrammer
@dsign, in diesen Tagen, in denen das Motherboard mehrere Hundert Gigs Speicher für weniger als 1000 € akzeptieren kann, ist ein paar Gig nicht sehr speicherintensiv.
AProgrammer
1
Stimmen Sie dem billigen Speicherteil zu. Was die Entwicklung angeht, bin ich schon eine Weile in C ++ und gute Codierungspraktiken machen Leckagen zu einem eher seltenen Phänomen. In dieser Hinsicht bevorzuge ich C ++ gegenüber Java.
Dsign

Antworten:

11

Wenn Sie über eine Anwendung sprechen, die die Grenzen der Maschine zwangsläufig betont , sodass Sie davon ausgehen, dass Sie Programmiertricks ausführen, um diese Grenzen nicht zu überschreiten, ist C ++ der richtige Weg. Nicht nur C ++ bietet Ihnen Raum für Optimierungen, wo Java dies nicht tut (wie Emilio betonte), sondern auch Garbage-Collectors sind sehr speicherhungrige Geräte, die viel zusätzlichen freien Speicher benötigen, um effizient zu arbeiten.

Die Antworten auf diese Frage: StackOverflow: Wie viel zusätzlichen Speicher benötigt die Speicherbereinigung ? Malen Sie ein ziemlich düsteres Bild, aber selbst wenn Garbage Collectors benötigen, dass der freie Speicher nur ungefähr so groß ist wie der zugewiesene Speicher (was ich gehört habe), bedeutet dies immer noch, dass Sie mit Java immer noch viel freien Speicher benötigen damit es effizient läuft.

Andererseits ziehen wir es heutzutage im Allgemeinen vor, teurere Hardware zu kaufen, anstatt Programmiertricks ausführen zu müssen, um zu vermeiden, dass die Grenzen der Hardware überschritten werden. In Ihrem Fall werden Ihre RAM-Probleme normalerweise gelöst, indem Sie einen 64-Bit-Computer verwenden und so viele RAM-Module wie nötig darauf werfen. Sie sehen, die Kosten für Hardware sind heutzutage bei weitem nicht annähernd so hoch wie die Kosten für die Entwicklungszeit in den Industrieländern.

Ich denke, Sie sollten diese Option ernsthaft in Betracht ziehen und, wenn möglich, diese Option und Java anstelle von C ++ wählen, da es viel einfacher ist, etwas in Java als in C ++ zu entwickeln und es anschließend weiter zu pflegen.

Mike Nakis
quelle
Danke für deine Antwort. Ich stimme Ihrer Hardware-Abbildung zu.
Dsign
Wenn Sie sich nicht darum kümmern, dass das Programm angehalten wird, während die Speicherbereinigung ausgeführt wird, ist der Speicherbedarf viel geringer.
1
Ich stimme dem letzten Absatz nicht zu. Java ist nicht unbedingt einfacher zu entwickeln als C ++. Es wäre nichts für mich, da ich in den letzten fünf oder sechs Jahren viel C ++ und relativ wenig Java gemacht habe. Es ist möglich, wartbaren und nicht wartbaren Code sowohl in C ++ als auch in Java zu schreiben.
David Thornley
1
@ DavidThornley Ich habe C / C ++ seit mehr als 10 Jahren und Java seit mehr als 6 Jahren gemacht. Ich finde Java in jeder Hinsicht einfacher: Prototyping, Entwicklung, Erweiterung und Wartung. Aber auf jeden Fall ist es das, was Meinungen tun sollen: unterschiedlich . C -: =
Mike Nakis
Hat jemand von Ihnen für ein prozessorhungriges Big-Data-Projekt programmiert? Irgendwelche Kommentare dort?
Unterzeichnen Sie
7

Das Problem ist, nicht C ++ zu verwenden, da es Java ist, und Java nicht zu verwenden, da es C ++ ist. Ein C ++ - Container wird normalerweise implementiert, um eine übermäßige Fragmentierung zu vermeiden, genau wie der Java Free Store.

Wenn Sie sich den Speicher jedoch direkt zuweisen, können Sie auch Dinge tun, die Java Ihnen nicht erlaubt, was zu einer Fragmentierung führen kann.

Die richtige Lösung (in C ++) ist die Verwendung von Containern und Smart-Zeigern durch Allokatorklassen, die die Zuordnung mithilfe fester "Plexe" verwalten (der Schlüsselpunkt ist hier das Schreiben einer guten Allokatorklasse). Und dies ist ein Programmierstil, der nichts mit Java zu tun hat, daher ist jeder Vergleich bedeutungslos.

[BEARBEITEN] Dies kann ein veraltetes Beispiel sein: Feste Zuordnung

Emilio Garavaglia
quelle
Danke für deine Antwort Emilio. Ich bin mir der Flexibilität von C ++ bewusst und bin geneigt, Ihnen zuzustimmen. Andererseits möchte ich einige Beispiele für die Verwendung in der Praxis kennenlernen, bei denen diese Techniken erfolgreich eingesetzt wurden.
Unterzeichnen Sie
@dsign: Beitrag bearbeitet, siehe den Link
Emilio Garavaglia
1
Ich habe diese Techniken zuvor verwendet. Bei einer App mit schlechter Leistung wurde der Allokator geändert, um eine Reihe von Heaps mit festen Blöcken zu verwenden. Wenn Sie also einen 4-Byte-Block wollten, kam dieser von dem Heap, auf dem nur 4-Byte-Blöcke gespeichert waren. Wenn Sie 5 Bytes wollten, stammten diese aus dem 8-Byte-Blockheap usw. Die Leistungssteigerung (für unsere stark zugewiesene App) war enorm. Sie erhalten möglicherweise kein so gutes Ergebnis, aber es kann sehr effektiv sein. Es gab auch keine Fragmentierung, da alle Zuordnungen in festen Blöcken kamen.
Gbjbaanb
2

Der Vorteil der Speicherbereinigung besteht darin, dass eine Maschine mit unendlich viel Speicher simuliert wird. Der Mechanismus oder die Implementierung dieser Abstraktion soll für Sie als Programmierer vollständig transparent sein. Wir alle wissen, dass der Mechanismus Speicher zurückfordert, der vom Programm nicht mehr verwendet wird, der jedoch nicht garantiert ist. Wenn Sie das Programm auf einem Computer mit mehr RAM ausführen, als das Programm jemals tatsächlich verwendet, wird die Speicherbereinigung möglicherweise nie durchgeführt. Auch dies ist irrelevant, da Sie das Programm einfach schreiben können, ohne Rücksicht darauf, wie es Speicher verwendet. Der Speichermanager weist einfach mehr RAM zu, wenn das Programm dies anfordert, und Sie können davon ausgehen, dass solche Zuweisungen immer erfolgreich sind. Java ist eine durch Müll gesammelte Sprache und C ++ nicht. 1

Der Nachteil der Speicherbereinigung besteht darin, dass sie wie alle Abstraktionen undicht ist. Es funktioniert nicht immer perfekt, insbesondere in Randfällen, und es ist wahrscheinlich, dass Sie auf Fehler stoßen. Die Leute, die den Garbage Collection-Algorithmus geschrieben haben (der für Sie als Programmierer transparent sein soll), sind für die häufigsten Fälle optimiert, und das Problem mit häufigen Fällen ist, dass sie nie so häufig sind. Im Allgemeinen können Sie beim Verwalten des Speichers nichts Besseres tun als der Garbage Collector. Aber unter bestimmten Umständen (und bei ausreichender Zeit, Energie und Verständnis) könnte dies möglich sein. C ++ bietet Ihnen diese Flexibilität. Java nicht.

Trotzdem denke ich, dass hier die Standardempfehlung für die Auswahl einer Sprache gilt, vielleicht sogar noch mehr in diesem Fall angesichts der Einschränkungen. Wählen Sie die Sprache aus, die den Hauptentwicklern für das Projekt am vertrautesten ist. Neben den offensichtlichen Gründen (wie Sie die App schneller und effizienter entwickeln können) ist dies besonders wichtigWichtig in dem von Ihnen beschriebenen Fall, da das Programmieren von C ++ wie das Programmieren von Java zu furchtbar ineffektiven Speicherverwaltungspraktiken und damit zu Undichtigkeiten und Abstürzen führen wird. Analog dazu wird das Programmieren in Java, wie Sie es in C ++ programmieren, nicht viel nützen und möglicherweise zu einem weniger als optimierten Programm führen, da die Garbage Collection-Algorithmen für die häufigsten Fälle optimiert und optimiert sind .

Programmierer, die es gewohnt sind, in von Müll gesammelten Sprachen zu arbeiten, lernen, dem Müllsammler zu vertrauen, anstatt dagegen zu kämpfen. Wenn Sie in einer Sprache arbeiten, in der Müll gesammelt wird, sind dies die Programmierer, die Sie für Ihr Projekt benötigen. Programmierer, die es nicht sindgewohnt, in einer von Müll gesammelten Sprache zu arbeiten, sind einer solchen "unendlichen Erinnerung" -Abstraktion von Natur aus skeptisch und häufig mit vielen guten Gründen. So gut diese Programmierer auch sein mögen, sie sind nicht die, die Sie in einer von Müll gesammelten Sprache arbeiten möchten, da sie bei jedem Schritt des Weges gegen den GC kämpfen, ihn ständig hinterfragen und oft langsamer und weniger speichereffizient produzieren Code als der andere Programmierertyp. Bestenfalls verbringen sie viel Zeit damit, das Rad neu zu erfinden, was Sie viel Geld und noch mehr langfristige Wartungskosten kostet.

Und dann müssen Sie sich auch fragen, ob es wirklich wichtig ist. Bo's abfälliger Kommentar enthält mehr als einen Hinweis auf die Wahrheit: Das Gedächtnis ist jetzt so billig, dass es kaum zu viel Handarbeit wert ist. Selbst wenn Sie massive Mengen benötigen , sind diese Mengen heute nicht annähernd so massiv wie vor 10 Jahren. Programmierer und Anwendungsentwicklung sind weitaus teurer als nur RAM und Rechenleistung zu kaufen. Das bedeutet nicht, dass Sie die Wirtschaft nach Möglichkeit meiden sollten, aber es bedeutet auch, dass Sie nicht zu viel Zeit damit verschwenden sollten.


1 Natürlich hebt diese Annahme einen tieferen Fehler in der Frage hervor. Wie sich herausstellt, ist "Java oder C ++" ein bisschen wie ein roter Hering. Die Standard-Java-Implementierung bietet Garbage Collection und C ++ entspricht nicht dem Sprachstandard, aber es gibt absolut keinen Grund, warum Sie keinen Garbage Collector eines Drittanbieters für C ++ verwenden könnten. Viele Unternehmen haben ihren Lebensunterhalt damit verdient, diese Dinge zu verkaufen, und einige haben wahrscheinlich ihren Lebensunterhalt damit verdient, sie kostenlos zu verschenken.

Cody Gray
quelle