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?
Antworten:
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.
quelle
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
quelle
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.
quelle