Denn es gibt einen großen Unterschied zwischen der Optimierung der Leistung und der vollständigen Abschaltung einer Sicherheit
Durch die Reduzierung der Anzahl der GCs reagiert das Framework schneller und kann (vermutlich) schneller ausgeführt werden. Wenn Sie nun für den Garbage Collector optimieren, bedeutet dies nicht, dass Sie niemals eine Garbage Collection durchführen. Es bedeutet nur, dass sie es seltener machen und wenn sie es tun, läuft es sehr schnell. Diese Art der Optimierung umfasst:
- Minimieren der Anzahl von Objekten, die sich in ein Überlebensfeld bewegen (dh mindestens eine Speicherbereinigung überlebt haben), indem kleine Wegwerfobjekte verwendet werden. Objekte, die in den Überlebensraum verschoben wurden, sind schwerer zu sammeln, und eine Speicherbereinigung hier impliziert manchmal das Einfrieren der gesamten JVM.
- Ordnen Sie zunächst nicht zu viele Objekte zu. Dies kann nach hinten losgehen, wenn Sie nicht vorsichtig sind, da die Objekte der jungen Generation super billig zuzuordnen und zu sammeln sind.
- Stellen Sie sicher, dass das neue Objekt auf das alte zeigt (und nicht umgekehrt), damit das junge Objekt leicht zu sammeln ist, da es keinen Verweis darauf gibt, durch den es aufbewahrt wird
Wenn Sie die Leistung einstellen, stellen Sie normalerweise einen bestimmten "Hot Spot" ein, während Sie Code ignorieren, der nicht häufig ausgeführt wird. Wenn Sie das in Java tun, können Sie den Garbage Collector immer noch für diese dunklen Ecken sorgen lassen (da dies keinen großen Unterschied macht), während Sie sehr sorgfältig für Bereiche optimieren, die in einer engen Schleife laufen. So können Sie entscheiden, wo Sie optimieren möchten und wo nicht. So können Sie Ihre Anstrengungen dort konzentrieren, wo es darauf ankommt.
Wenn Sie nun die Speicherbereinigung vollständig deaktivieren, können Sie keine Auswahl treffen. Sie müssen jedes Objekt manuell entsorgen . Wird diese Methode höchstens einmal am Tag aufgerufen? In Java können Sie dies zulassen, da die Auswirkungen auf die Leistung vernachlässigbar sind (es kann in Ordnung sein, jeden Monat eine vollständige GC durchzuführen). In C ++ verlieren Sie immer noch Ressourcen, sodass Sie sich auch um diese undurchsichtige Methode kümmern müssen. Sie müssen also den Preis für das Ressourcenmanagement in jedem einzelnen Teil Ihrer Anwendung bezahlen , während Sie sich in Java konzentrieren können.
Aber es wird schlimmer.
Was ist, wenn Sie einen Fehler haben, beispielsweise in einer dunklen Ecke Ihrer Anwendung, auf die nur am Montag bei Vollmond zugegriffen wird? Java hat eine starke Sicherheitsgarantie. Es gibt wenig bis gar kein "undefiniertes Verhalten". Wenn Sie etwas falsches verwenden, wird eine Ausnahme ausgelöst, Ihr Programm wird gestoppt und es treten keine Datenbeschädigungen auf. Sie sind sich also ziemlich sicher, dass nichts passieren kann, ohne dass Sie es merken.
Aber in etwas wie D können Sie einen schlechten Zeigerzugriff oder einen Pufferüberlauf haben, und Sie können Ihren Speicher beschädigen, aber Ihr Programm wird es nicht wissen (Sie haben die Sicherheit ausgeschaltet, merken Sie sich das?) Und wird mit seiner falschen fortfahren Daten, und machen Sie einige ziemlich böse Dinge und beschädigen Sie Ihre Daten, und Sie wissen es nicht, und wenn mehr Korruption auftritt, werden Ihre Daten immer falscher, und dann brechen sie plötzlich, und es war in einer lebenswichtigen Anwendung, und Bei der Berechnung einer Rakete ist ein Fehler aufgetreten, und daher funktioniert die Rakete nicht. Die Rakete explodiert, und jemand stirbt, und Ihre Firma steht auf der Titelseite jeder Zeitung, und Ihr Chef zeigt mit dem Finger auf Sie und sagt: "Sie sind Der Ingenieur, der vorschlug, dass wir D zur Leistungsoptimierung verwenden, warum haben Sie nicht an Sicherheit gedacht?". Und es ist deine Schuld. Du hast diese Leute mit deinem dummen Versuch getötet, aufzutreten.
OK, ok, meistens ist es viel weniger dramatisch. Aber selbst eine geschäftskritische Anwendung oder nur eine GPS-App oder zum Beispiel eine Website für das Gesundheitswesen kann bei Fehlern ziemlich negative Konsequenzen haben. In der Regel ist es eine sehr gute Idee, eine Sprache zu verwenden, die sie entweder vollständig verhindert oder bei ihrem Auftreten ausfällt.
Das Ausschalten einer Sicherheit ist mit Kosten verbunden. Einheimische zu werden macht nicht immer Sinn. Manchmal ist es viel einfacher und sicherer, nur ein bisschen eine sichere Sprache zu optimieren, um all-in für eine Sprache zu gehen, in der Sie sich selbst in den Fuß schießen können. Korrektheit und Sicherheit übertreffen in vielen Fällen die wenigen Nano-Sekunden, die Sie durch die vollständige Eliminierung des GC verschrottet hätten. Disruptor kann in solchen Situationen verwendet werden, daher denke ich, dass LMAX-Exchange den richtigen Anruf getätigt hat.
Aber was ist mit D im Besonderen? Sie haben einen GC, wenn Sie möchten, für die dunklen Ecken, und die SafeD-Untergruppe (die ich vor der Bearbeitung nicht kannte) entfernt undefiniertes Verhalten (wenn Sie daran denken, es zu verwenden!).
Nun, in diesem Fall ist es eine einfache Frage der Reife. Das Java-Ökosystem ist voller gut geschriebener Tools und ausgereifter Bibliotheken (besser für die Entwicklung). Sehr viel mehr Entwickler kennen Java als D (besser für die Wartung). Es wäre keine gute Idee gewesen, sich für eine neue und weniger beliebte Sprache zu entscheiden, die so wichtig ist wie eine Finanzanwendung. Wenn Sie ein Problem mit einer weniger bekannten Sprache haben, können Ihnen nur wenige helfen, und die Bibliotheken, die Sie finden, weisen tendenziell mehr Fehler auf, da sie weniger Personen ausgesetzt waren.
Mein letzter Punkt ist also: Wenn Sie Probleme mit schwerwiegenden Folgen vermeiden möchten, bleiben Sie bei sicheren Entscheidungen. Zu diesem Zeitpunkt im Leben von D sind seine Kunden die kleinen Start-ups, die bereit sind, verrückte Risiken einzugehen. Wenn ein Problem Millionen kosten kann, bleiben Sie besser in der Innovationsglockenkurve .