Ist Java wirklich langsam?

180

Java hat den Ruf, langsam zu sein .

  • Ist Java wirklich langsam?
  • Wenn ja, warum? Wo ist (oder war) der Engpass? Liegt es an ineffizienten JVMs? Müllabfuhr? Reine Bytecode-Bibliotheken anstelle von JNI-umhülltem C-Code? Viele andere Sprachen haben diese Funktionen, aber sie haben nicht den Ruf, langsam zu sein.
Stefano Borini
quelle
35
Die Leute werden so nervös ... sehen nicht, wie subjektiv oder argumentativ das sein kann. Ich frage mich, ob eine Frage wie "Warum die Blasensortierung langsam ist" das gleiche Ergebnis erzielen würde. Ich stellte eine technische Frage und wollte technische Antworten (die ich bekam), aber die Frage als subjektiv und argumentativ zu schließen, ist lächerlich.
Stefano Borini
1
Ich habe die meisten der Top-Kommentare gelesen und keiner von ihnen scheint die eklatante Tatsache anzusprechen, dass C # GUI-basierte Desktop-Anwendungen viel schneller ausgeführt werden als alle Java GUI-basierten Desktop-Anwendungen, einschließlich moderner.
BobTurbo
3
Als clientseitiger Webentwickler, der sich mit .net-Webformularen, .net MVC, PHP, Rails, Django und einer Vielzahl von Dingen außer Spring (was ich gehört habe, ist gut) in Java befasst hat, erwarte ich eine schlechte Leistung / Architektur von Backends, die von Java-Teams erstellt wurden. Ich vermute, das eigentliche Problem sind keine Benchmarks, sondern das Problem, dass es einfach eine Menge mittelmäßiger Java-Entwickler gibt. Das ist nicht die Schuld der Sprache. Es ist nicht die Schuld von Java-Entwicklern, die ihr Handwerk verbessern und andere Sprachen als Java lernen. Es kann jedoch die Schuld von Sun, Certs, den 90ern und der IT-Branche im Allgemeinen sein.
Erik Reppen

Antworten:

236

Das moderne Java ist eine der schnellsten Sprachen, obwohl es immer noch ein Gedächtnisfresser ist. Java hatte den Ruf, langsam zu sein, da der Start der VM früher lange dauerte.

Wenn Sie immer noch der Meinung sind , dass Java langsam ist , lesen Sie die Benchmark- Spielergebnisse. Eng optimierter Code, der in einer zuvor kompilierten Sprache (C, Fortran usw.) geschrieben wurde, kann ihn übertreffen. Java kann jedoch mehr als zehnmal so schnell sein wie PHP, Ruby, Python usw. Es gibt bestimmte Bereiche, in denen es gängige kompilierte Sprachen schlagen kann (wenn sie Standardbibliotheken verwenden).

Es gibt jetzt keine Entschuldigung für "langsame" Java-Anwendungen. Entwickler und Legacy-Code / Bibliotheken sind weit mehr als die Sprache schuld. Beschuldigen Sie auch alles "Unternehmen".

Um der Menge "Java ist langsam" gerecht zu werden, gibt es hier Bereiche, in denen es immer noch langsam ist (aktualisiert für 2013):

  • Bibliotheken werden oft für "Korrektheit" und Lesbarkeit geschrieben, nicht für Leistung. Meiner Meinung nach ist dies der Hauptgrund, warum Java immer noch einen schlechten Ruf hat, insbesondere auf der Serverseite. Dies macht die String-Probleme exponentiell schlimmer. Einige einfache Fehler sind häufig: Objekte werden häufig anstelle von Grundelementen verwendet, wodurch die Leistung verringert und die Speichernutzung erhöht wird. Viele Java-Bibliotheken (einschließlich der Standardbibliotheken) erstellen häufig Strings, anstatt veränderbare oder einfachere Formate (char [] oder StringBuffer) wiederzuverwenden. Dies ist langsam und erzeugt Tonnen von Müll, die später gesammelt werden können. Um dies zu beheben, schlage ich vor, dass Entwickler nach Möglichkeit primitive Sammlungen und insbesondere die Bibliotheken von Javalution verwenden.

  • String-Operationen sind etwas langsam. Java verwendet unveränderliche, UTF-16- codierte Zeichenfolgenobjekte. Dies bedeutet, dass Sie mehr Speicher und Speicherzugriff benötigen und einige Vorgänge komplexer sind als mit ASCII (C, C ++). Zu dieser Zeit war es die richtige Entscheidung für die Portabilität, aber es ist mit geringen Leistungskosten verbunden. UTF-8 scheint jetzt eine bessere Wahl zu sein.

  • Der Array-Zugriff ist im Vergleich zu C aufgrund von Grenzprüfungen etwas langsamer . Früher war die Strafe groß, jetzt ist sie gering (Java 7 optimiert viele redundante Grenzprüfungen).

  • Das Fehlen eines beliebigen Speicherzugriffs kann die Verarbeitung auf E / A- und Bitebene verlangsamen (z. B. Komprimierung / Dekomprimierung). Dies ist derzeit ein Sicherheitsmerkmal der meisten Hochsprachen.

  • Java verwendet viel mehr Speicher als C, und wenn Ihre Anwendung speicher- oder speicherbandbreitengebunden ist (Caching usw.), wird sie langsamer. Die Kehrseite ist, dass die Zuweisung / Freigabe sehr schnell erfolgt (hochoptimiert). Dies ist eine Funktion der meisten Hochsprachen, und zwar aufgrund von Objekten und der Verwendung von GC anstelle einer expliziten Speicherzuweisung. Plus schlechte Bibliotheksentscheidungen.

  • Stream-basierte E / A ist langsam, da (IMO, schlechte Auswahl) bei jedem Stream-Zugriff eine Synchronisierung erforderlich ist. NIO hat dies behoben, aber es ist ein Schmerz, es zu benutzen. Man kann dies umgehen, indem man anstelle eines Elements jeweils ein Array liest / schreibt.

  • Java bietet nicht die gleiche Low-Level-Funktionalität wie C, daher können Sie keine schmutzigen Inline-Assembler-Tricks verwenden, um einige Vorgänge zu beschleunigen. Dies bietet Portabilität und ist eine Funktion der meisten Hochsprachen.

  • Es ist üblich, dass Java-Anwendungen an sehr alte JVM-Versionen gebunden sind. Besonders serverseitig. Diese alten JVMs können im Vergleich zu den neuesten Versionen unglaublich ineffizient sein.

Letztendlich wurde Java entwickelt, um Sicherheit und Portabilität auf Kosten einer gewissen Leistung zu bieten, und für einige wirklich anspruchsvolle Operationen, die es zeigt. Der größte Teil seines Rufs für Langsamkeit ist nicht mehr verdient.


Es gibt jedoch mehrere Stellen, an denen Java schneller ist als die meisten anderen Sprachen:

  • Speicherzuweisung und Aufhebung der Zuweisung sind schnell und kostengünstig. Ich habe Fälle gesehen, in denen es 20% SCHNELLER (oder mehr!) Ist, ein neues Array mit mehreren kB zuzuweisen, als ein zwischengespeichertes wiederzuverwenden.

  • Objektinstanziierung und objektorientierte Funktionen sind blitzschnell zu verwenden (in einigen Fällen schneller als C ++), da sie von Anfang an entwickelt wurden. Dies ist teilweise eher auf eine gute GC als auf eine explizite Zuordnung zurückzuführen (was für viele kleine Objektzuweisungen freundlicher ist). Man kann C codieren, das dies übertrifft (indem man die benutzerdefinierte Speicherverwaltung rollt und Malloc effizient ausführt), aber es ist nicht einfach.

  • Methodenaufrufe sind grundsätzlich kostenlos und in einigen Fällen schneller als Code mit großen Methoden. Der HotSpot- Compiler verwendet Ausführungsinformationen zur Optimierung von Methodenaufrufen und verfügt über ein sehr effizientes Inlining. Durch die Verwendung der zusätzlichen Ausführungsinformationen können Compiler vorzeitig und sogar (in seltenen Fällen) manuelles Inlining übertroffen werden. Vergleichen Sie mit C / C ++, wo Methodenaufrufe mit einer kleinen Leistungsminderung verbunden sind, wenn der Compiler beschließt, nicht inline zu arbeiten.

  • Synchronisation und Multithreading sind einfach und effizient. Java wurde von Anfang an so konzipiert, dass es Thread-fähig ist, und das zeigt es. Moderne Computer verfügen normalerweise über mehrere Kerne. Da das Threading in die Sprache integriert ist, können Sie dies ganz einfach nutzen. Grundsätzlich ein zusätzlicher Geschwindigkeitsschub von 100% bis 300% im Vergleich zu Standard-C-Code mit einem Thread. Ja, sorgfältig geschriebenes C-Threading und Bibliotheken können dies übertreffen, aber das ist eine Menge zusätzlicher Arbeit für den Programmierer.

  • Zeichenfolgen enthalten Länge: Einige Operationen sind schneller. Dies schlägt mit nullbegrenzten Zeichenfolgen (in C üblich). In Java 7 hat Oracle die Optimierung von String.subString () entfernt, weil die Leute sie dumm verwendeten und Speicherlecks erhielten.

  • Die Array-Kopie ist stark optimiert. In den neuesten Versionen verwendet Java einen handabgestimmten Assembler für System.arraycopy. Das Ergebnis ist, dass ich bei Arraycopy / Memcopy-lastigen Operationen gesehen habe, dass mein Code das Äquivalent in C um vernünftige Ränder übertrifft.

  • Der JIT-Compiler ist geschickt in der Verwendung des L1 / L2- Cache . Vorab kompilierte Programme können ihren Code nicht in Echtzeit an die spezifische CPU und das System anpassen, auf dem sie ausgeführt werden. JIT bietet auf diese Weise einige sehr effiziente Schleifentransformationen.

Einige andere historische Fakten haben zum Ruf "Java ist langsam" beigetragen:

  • Vor der JIT-Kompilierung (Java 1.2 / 1.3) wurde die Sprache nur interpretiert, nicht kompiliert und war daher sehr langsam.
  • Die JIT-Kompilierung brauchte Zeit, um effizient zu werden (wesentliche Verbesserungen mit jeder Version).
  • Das Laden von Klassen ist im Laufe der Jahre viel effizienter geworden. Früher war es beim Start ziemlich ineffizient und langsam.
  • Swing- und UI-Code verwendeten native Grafikhardware nicht sehr gut.
  • Swing ist einfach schrecklich. Ich beschuldige AWT und Swing, warum Java sich nie für den Desktop durchgesetzt hat.
  • Starker Einsatz der Synchronisation in Bibliotheksklassen; Nicht synchronisierte Versionen sind jetzt verfügbar
  • Das Laden von Applets dauert ewig, da eine vollständige JAR über das Netzwerk übertragen und die VM zum Booten geladen wird .
  • Die Synchronisierung ist mit erheblichen Leistungseinbußen verbunden (dies wurde mit jeder Java-Version optimiert). Reflexion ist jedoch immer noch kostspielig.
BobMcGee
quelle
49
Object instantiation and object-oriented features are blazing fast to use (faster than C++ in many cases) because they're designed in from the beginning.und Collections are fast. Standard Java beats standard C/C++ in this area, even for most optimized C code.sind wilde Behauptungen, die nicht durch hier verlinkte Beweise gestützt werden.
Sjoerd
8
@Sjoerd - Die Behauptungen sind kaum wild - sie sind für mich offensichtlich und sollten für jeden gelten, der die Unterschiede in der Architektur des Standardspeichersystems in C / C ++ gegenüber Java versteht. Sie können es noch viel besser machen, wenn Sie Ihre eigenen Speicherhandler schreiben (mit Dingen wie freien Listen, Speicherpools usw.) oder eine Bibliothek verwenden, die solche implementiert.
Rex Kerr
15
@ Rex Kerr - Warum Speicherhandler verwenden, wenn Sie zB den Stapel für die Zuordnung verwenden können?! Sie verwechseln die Zuordnung des Heapspeichers mit der Objektinstanziierung.
Sjoerd
20
@Rex Kerr - Grundsätzlich behaupten Sie, dass alles in Java schneller ist, weil alles in Java die Zuweisung von Speicher auf dem Heap beinhaltet und weil die Zuweisung von Java auf dem Heap in Java schneller ist als die von C ++. Hier einige Neuigkeiten für Sie: In C ++ können Sie in vielen Fällen auf die Zuweisung von Speicher auf dem Heap verzichten!
Sjoerd
10
@Sjoerd - Wo habe ich gesagt, dass alles in Java schneller ist? Lesen Sie einfach, was ich gesagt habe. Ich sagte, was ich meinte, und habe bereits alles angesprochen, was Sie in Ihrem letzten Kommentar gesagt haben.
Rex Kerr
49

Anfangs war Java nicht besonders schnell, aber es ist auch nicht übermäßig langsam. In diesen Tagen ist Java sehr schnell. Von den Leuten, mit denen ich gesprochen habe, kommt der Eindruck, dass Java langsam ist, von zwei Dingen:

  1. Langsame VM-Startzeit. Die frühe Java-Implementierung dauerte lange, bis die erforderlichen Bibliotheken und die Anwendung im Vergleich zu nativen Anwendungen gestartet und geladen wurden.

  2. Langsame Benutzeroberfläche. Early Swing war langsam. Es hat wahrscheinlich nicht geholfen, dass die meisten Windows-Benutzer das Standard-Metal L & F auch hässlich fanden.

Angesichts der oben genannten Punkte ist es kein Wunder, dass die Leute den Eindruck haben, Java sei langsam.

Für Benutzer oder Entwickler, die mit der Entwicklung nativer Anwendungen oder sogar Visual Basic- Anwendungen vertraut sind, sind diese beiden Punkte in einer Anwendung am sichtbarsten, und es ist der erste Eindruck, den Sie über eine Anwendung erhalten (es sei denn, es handelt sich um eine Nicht-GUI-Anwendung, in der Fall gilt nur die 1..).

Sie werden einen Benutzer nicht davon überzeugen, dass "der Code sehr schnell ausgeführt wird", wenn der Start der Anwendung 8 Sekunden dauert, im Vergleich zu seiner alten Visual Basic-Anwendung, die sofort gestartet wird - obwohl die Codeausführung und die Startzeit möglicherweise überhaupt nicht verbunden sind.

Den ersten Eindruck zu ruinieren ist eine großartige Möglichkeit, Gerüchte und Mythen in Gang zu setzen. Und Gerüchte und Mythen sind schwer zu töten.

Kurz gesagt, Java ist nicht langsam. Menschen mit der Einstellung "Java ist langsam" basieren auf ersten Eindrücken von Java vor mehr als 10 Jahren.

nr
quelle
3
Java war vor einigen Jahren sehr langsam, aber in den letzten Benchmark-Tests läuft es fast so schnell wie C / C ++ und in einigen Situationen schneller.
ChadNC
23
Java-Apps unter OSX 10.6 auf meinem Macbook starten viel langsamer als in Objective-C geschriebene Apps. Welche Beweise für schnelle Startzeiten?
Zan Lynx
2
Dekomprimierung ist absolut kein Leistungsproblem. Mein Computer dekomprimierte 1992 ausführbare Dateien beim Starten von Programmen, die die Leistung gegenüber dem Laden einer längeren Datei von der Festplatte verbesserten. Die Unterschiede zwischen CPU und Festplatte haben in den vergangenen Jahren enorm zugenommen. Es gibt jedoch ein Problem bei der Verwendung des Zip-Archivformats für rt.jar (warum? !!!) und die enthaltenen Klassendateien sind nicht verknüpft (verrückt !!).
Tom Hawtin - Tackline
5
@Zan: Beachten Sie, dass die JVM für Mac OS X von Apple geschrieben (oder zumindest angepasst) wurde. Sun hat einige Zeit investiert, um die Startzeiten auf den von ihnen unterstützten Plattformen (Windows, Linux und Solaris) zu verkürzen, konnte dies jedoch nicht für Mac OS x tun (da dieser Port nicht verwaltet wird). Es könnte sein, dass Mac nicht alle diese Optimierungen auf Mac OS X anwenden konnte / konnte / portierte.
Joachim Sauer
1
Ich halte Java nicht für langsam (ich kenne einen Spielehersteller, der Spiele darin macht); nur schlecht aus UI-Gründen. Keine einzige "normale" Java-App, die ich gesehen habe, hat eine anständige, vollständig funktionierende Benutzeroberfläche.
RCIX
40

Nachdem ich eine Seite voller Kommentare gelesen habe, die besagen, dass Java nicht langsam ist, muss ich nur mit einer anderen Meinung antworten.

Die Langsamkeit einer Sprache hängt stark davon ab, was Sie von "schnell" erwarten. Wenn Sie C # für schnell halten, ist Java sicherlich auch schnell. Wenn Ihre Problemdomäne mit Datenbanken oder der Halb-Echtzeit-Verarbeitung zusammenhängt, ist Java sicherlich auch schnell genug. Wenn Sie Ihre Anwendung gerne durch Hinzufügen weiterer Hardware skalieren möchten, ist Java wahrscheinlich schnell für Sie. Wenn Sie der Meinung sind, dass sich eine konstante Faktorbeschleunigung auf der Skala von 5 bis 10 nicht lohnt, ziehen Sie Java wahrscheinlich als schnell in Betracht.

Wenn Sie numerische Berechnungen für große Datenmengen durchführen oder an eine Ausführungsumgebung gebunden sind, in der die CPU-Ressourcen begrenzt sind und eine konstante Beschleunigung im Bereich von 5 bis 10 enorm wäre. Selbst eine Beschleunigung von 0,5 kann eine Reduzierung um 500 Stunden bedeuten, damit die Berechnung abgeschlossen werden kann. In diesen Fällen können Sie mit Java nicht den letzten Meter an Leistung erzielen, und Sie würden Java wahrscheinlich als langsam betrachten.

Sami
quelle
2
stimmte zu und +1 für den gesamten Beitrag, da Sie einen gültigen Punkt präsentieren. C ++ hat jedoch den unterschiedlichen Ruhm, dass es schwierig zu debuggen und leicht das ganze Bein abzublasen ist, aber selten hörte ich, dass C ++ so langsam ist wie ich von Java gehört habe.
Stefano Borini
33

Sie scheinen zwei ziemlich unterschiedliche Fragen zu stellen:

  1. Ist Java wirklich langsam und wenn ja, warum?
  2. Warum wird Java als langsam empfunden, obwohl es schneller ist als viele Alternativen?

Die erste Frage ist mehr oder weniger die Frage "Wie lang ist ein Seil?". Es kommt auf Ihre Definition von "langsam" an. Im Vergleich zu einem reinen Interpreter ist Java extrem schnell. Im Vergleich zu anderen Sprachen, die (normalerweise) zu einer Art Bytecode kompiliert und dann dynamisch zu Maschinencode kompiliert werden (z. B. C # oder irgendetwas anderes in .NET), ist Java ungefähr gleichwertig. Im Vergleich zu den Sprachen, die normalerweise zu reinem Maschinencode kompiliert werden und in denen (oft große) Teams nur an der Verbesserung ihrer Optimierer (z. B. C, C ++, Fortran, Ada) arbeiten, ist Java in einigen Punkten recht gut , aber insgesamt neigt dazu, zumindest etwas langsamer zu sein.

Vieles davon hängt hauptsächlich mit der Implementierung zusammen - im Grunde kommt es darauf an, dass ein Benutzer wartet, während ein dynamischer / JIT-Compiler ausgeführt wird. Es sei denn, Sie haben ein Programm, das zunächst eine Weile läuft Es ist schwer zu rechtfertigen, dass der Compiler viel Zeit mit schwierigen Optimierungen verbringt. Daher geben die meisten Java-Compiler (und C # -Compiler usw.) keinen großen Aufwand für wirklich schwierige Optimierungen. In vielen Fällen geht es weniger darum, welche Optimierungen vorgenommen werden, als darum, wo sie angewendet werden. Viele Optimierungsprobleme sind NP-vollständig, sodass die Zeit, die sie benötigen, mit der Größe des angegriffenen Problems schnell zunimmt. Eine Möglichkeit, die Zeit im Rahmen der Vernunft zu halten, besteht darin, die Optimierung jeweils nur auf eine einzelne Funktion anzuwenden. Wenn nur der Entwickler auf den Compiler wartet, Sie können es sich leisten, viel länger zu dauern und dieselbe Optimierung auf viel größere Teile des Programms anzuwenden. Ebenso ist der Code für einige Optimierungen ziemlich haarig (und kann daher ziemlich groß sein). Da der Benutzer wartet, während dieser Code geladen wird (und die JVM-Startzeit häufig ein wesentlicher Faktor für die Gesamtzeit ist), muss die Implementierung die an einem Ort gesparte Zeit mit der an einem anderen verlorenen Zeit in Einklang bringen - und wenn man bedenkt, wie wenig Code vorhanden ist profitiert von den haarigen Optimierungen, die JVM klein zu halten ist normalerweise vorteilhafter.

Ein zweites Problem ist, dass Sie mit Java häufig eine mehr oder weniger einheitliche Lösung erhalten. Zum Beispiel ist Swing für viele Java-Entwickler im Wesentlichen die einzige verfügbare Fensterbibliothek. In so etwas wie C ++ gibt es buchstäblich Dutzende von Fensterbibliotheken, Anwendungsframeworks usw., von denen jede ihre eigenen Kompromisse zwischen Benutzerfreundlichkeit und schneller Ausführung, konsistentem Erscheinungsbild und nativem Erscheinungsbild und so weiter aufweist. Der einzige wirkliche Knackpunkt ist, dass einige (z. B. Qt) ziemlich teuer sein können (zumindest für den kommerziellen Gebrauch).

Drittens ist viel in C ++ geschriebener Code (und noch mehr in C) einfach älter und ausgereifter. Viele davon enthalten einen Kern von Routinen, die vor Jahrzehnten geschrieben wurden, als zusätzliche Zeit für die Optimierung des Codes normales, erwartetes Verhalten war. Das hat oft einen echten Vorteil in Code, der kleiner und schneller ist. C ++ (oder C) erhält die Anerkennung dafür, dass der Code klein und schnell ist, aber es ist viel mehr ein Produkt des Entwicklers und der Einschränkungen der Zeit, in der der Code geschrieben wurde. Bis zu einem gewissen Grad führt dies zu einer sich selbst erfüllenden Prophezeiung - wenn Menschen Wert auf Geschwindigkeit legen, wählen sie häufig C ++, weil es diesen Ruf hat. Sie investieren zusätzliche Zeit und Mühe in die Optimierung, und es wird eine neue Generation von schnellem C ++ - Code geschrieben.

Zusammenfassend lässt sich sagen, dass die normale Implementierung von Java eine maximale Optimierung bestenfalls problematisch macht. Schlimmer noch, wo Java sichtbar ist , spielen beispielsweise Fenster-Toolkits und die Startzeit von JVM oft eine größere Rolle als die Ausführungsgeschwindigkeit der Sprache selbst. In vielen Fällen erhalten C und C ++ auch Anerkennung dafür, was wirklich das Ergebnis einer einfach härteren Optimierung ist.

Was die zweite Frage betrifft, denke ich, dass es bei der Arbeit größtenteils um die menschliche Natur geht. Einige Eiferer behaupten ziemlich aufgebläht, Java sei unglaublich schnell. Jemand probiert es aus und stellt fest, dass selbst ein triviales Programm einige Sekunden benötigt, um gestartet zu werden, und fühlt sich langsam und ungeschickt an, wenn es ausgeführt wird. Nur wenige analysieren wahrscheinlich Dinge, um festzustellen, dass ein Großteil davon die Startzeit der JVM ist und dass beim ersten Ausprobieren noch kein Code kompiliert wurde - ein Teil des Codes wird interpretiert. und einige werden zusammengestellt, während sie warten. Schlimmer noch, selbst wenn es schnell genug läuft, erscheint das Erscheinungsbild den meisten Benutzern normalerweise fremd und ungeschickt. Selbst wenn objektive Messungen schnelle Reaktionszeiten zeigten, würde es dennoch ungeschickt erscheinen.

Das Addieren dieser führt zu einer ziemlich einfachen und natürlichen Reaktion: Java ist langsam, hässlich und ungeschickt. Angesichts des Hype, der besagt, dass es sehr schnell ist, besteht die Tendenz, zu überreagieren und daraus zu schließen, dass es schrecklich langsam ist, anstatt eines (genaueren) "etwas langsamer, und das meistens unter bestimmten Umständen". Dies ist im Allgemeinen am schlimmsten für einen Entwickler, der die ersten Programme in der Sprache schreibt. Die Ausführung eines "Hallo Welt" -Programms in den meisten Sprachen erscheint sofort, aber in Java gibt es eine leicht wahrnehmbare Pause, wenn die JVM gestartet wird. Sogar ein reiner Interpreter, der in engen Schleifen viel langsamer läuft und der für Code wie diesen oft noch schneller erscheint, einfach weil er geladen werden kann und etwas früher ausgeführt werden kann.

Jerry Sarg
quelle
16

Es handelt sich um veraltete Informationen aus den frühen Tagen (Mitte bis Ende der neunziger Jahre) von Java. Jede Hauptversion von Java hat im Vergleich zur vorherigen Version erhebliche Beschleunigungen eingeführt. Da Oracle JRockit offenbar mit Suns JVM für Java 7 zusammenführt, dürfte sich dieser Trend fortsetzen.

Im Vergleich zu vielen anderen populären modernen Sprachen (Python, Ruby, PHP) ist Java für die meisten Anwendungen tatsächlich erheblich schneller. Es passt nicht ganz zu C oder C ++, aber für viele Aufgaben ist es nah genug. Die wirklichen Leistungsprobleme sollten darin bestehen, wie viel Speicher letztendlich verwendet wird.

Dan Dyer
quelle
14

Der Hauptschuldige an der "langen Startzeit" ist die dynamische Verknüpfung. Eine Java-Anwendung besteht aus kompilierten Klassen. Jede Klasse Referenzen andere Klassen (für Argumenttypen, Verfahren Anrufungen ...) durch Namen . Die JVM muss diese Namen beim Start prüfen und abgleichen. Dies geschieht schrittweise und erledigt nur die Teile, die zu einem bestimmten Zeitpunkt benötigt werden. Dies ist jedoch noch einige Arbeit.

In einer C-Anwendung tritt diese Verknüpfungsphase am Ende der Kompilierung auf. Es ist langsam, besonders für große Anwendungen, aber nur der Entwickler sieht es. Das Verknüpfen ergibt eine ausführbare Datei, die das Betriebssystem einfach "wie sie ist" in den RAM laden muss.

In Java erfolgt die Verknüpfung jedes Mal, wenn die Anwendung ausgeführt wird. Daher die lange Startzeit.

Es wurden verschiedene Optimierungen angewendet, einschließlich Caching-Techniken, und Computer werden schneller (und sie werden "schneller" als Anwendungen "größer"), sodass die Problembedeutung in letzter Zeit stark abgenommen hat. aber das alte Vorurteil bleibt.

Was die Leistung danach betrifft, zeigen meine eigenen Benchmarks für kompakte Berechnungen mit Array-Zugriffen (hauptsächlich Hash-Funktionen und andere kryptografische Algorithmen) normalerweise, dass optimierter C-Code etwa dreimal schneller ist als Java-Code. manchmal ist C nur 30% schneller als Java, manchmal kann C je nach implementiertem Algorithmus 4x schneller sein. Ich habe einen 10-fachen Faktor gesehen, als der "C" -Code aufgrund der 64x64-> 128-Multiplikations-Opcodes, die der Prozessor anbietet, tatsächlich für große Integer-Arithmetik zusammengesetzt wurde, aber Java nicht verwenden kann, da sein längster Integer-Typ 64-Bit ist long. Dies ist ein Randfall. Unter praktischen Bedingungen verhindern Überlegungen zur E / A- und Speicherbandbreite, dass C-Code wirklich dreimal schneller als Java ist.

Thomas Pornin
quelle
Hmm ... Ich dachte, die meisten C-Bibliotheken sind heutzutage auch dynamisch verknüpft. Oder sprichst du von etwas anderem?
Sean McMillan
4
@Sean: Die dynamische Verknüpfung für C erfolgt für "externe Symbole": die Funktionen, die in einer DLL verwendet und in einer anderen definiert werden. Eine typische C-Anwendung verwendet ein Dutzend DLLs. Für Java erfolgt die dynamische Verknüpfung für alle Methoden in allen Klassen: In einer typischen Java-Anwendung (einschließlich der Standardbibliothek) gibt es Tausende davon. In der C-Welt werden die meisten Verknüpfungen (alle Verknüpfungen, die keine DLL-Grenze überschreiten) zur Kompilierungszeit aufgelöst. Zur Laufzeit bleibt nur noch ein kleiner Teil übrig.
Thomas Pornin
14

Java ist definitiv langsam, insbesondere für quantitative Arbeiten.

Ich verwende eine Kombination aus R , Python und C / C ++ mit optimierten Multithread- ATLAS- Bibliotheken. In jeder dieser Sprachen kann ich eine Matrix von 3000 mal 3000 Doppel mit sich selbst in ungefähr 4 Sekunden multiplizieren. Bei Verwendung von Colt und Parallel Colt in Java dauert der gleiche Vorgang 185 Sekunden! Erstaunlich, obwohl diese Java-Bibliotheken paralleler Natur sind.

Alles in allem ist reines Java also nicht für quantitative Arbeiten geeignet. Jblas scheint die beste lineare Algebra-Bibliothek für Java zu sein, da ATLAS verwendet wird.

Mein Computer ist ein HP Core 2 Duo mit 3 GB RAM. Ich benutze 64-Bit- Ubuntu 10.04 (Lucid Lynx).

Hamaad Shah
quelle
In Anlehnung an meinen oben genannten Kommentar führte ich dieselbe Matrixmultiplikationsoperation mit JAMA durch und es dauerte ungefähr 50 Sekunden. Immer noch zu langsam im Vergleich zu anderen Sprachen.
Hamaad Shah
7
Wie lange hat Java gedauert, als Sie die Multiplikation in den über JNI aufgerufenen Bibliotheken durchgeführt haben? Angesichts der Tatsache, dass alles, was Sie in C / C ++ tun können, mit JNI möglich ist (einige hundert Mnano-Sekunden hinzufügen), ist der Spielraum relativ klein. Ich vermute, Ihre R- und Python-Matrixmultiplikation wurde nicht in R oder Python geschrieben, sondern nur aus diesen Sprachen aufgerufen.
Peter Lawrey
2
Haben Sie aus Neugier ein Profiling durchgeführt, um festzustellen, ob Ihr Code einen Hotspot enthält (Typkonvertierung / Autoboxing)?
Thorbjørn Ravn Andersen
10

Für die meisten Erfahrungen der Menschen mit ihm interagieren - Java ist langsam. Wir haben alle gesehen, dass sich die Kaffeetasse in unserem Browser dreht, bevor ein Applet angezeigt wird. Es dauert eine Weile, bis die JVM hochgefahren und die Applet-Binärdateien heruntergeladen sind. Dies wirkt sich auf die Benutzererfahrung auf eine Weise aus, die bemerkt wird.

Es hilft nicht, dass die langsame Zeit für das Herunterfahren von JVM und das Herunterladen von Applets auffällig mit einer Java-Kaffeetasse gekennzeichnet ist, sodass die Leute das Warten mit Java assoziieren. Wenn Blitz eine lange Zeit dauert zu laden, wird das Branding der „Laden“ Nachricht von dem Flash - Entwickler angegeben, so dass die Leute Blitz nicht die Schuld Technologie als Ganzes.

All dies hat nichts mit der Leistung von Java auf einem Server oder mit den vielen anderen Möglichkeiten zu tun, die Java außerhalb des Browsers verwendet. Aber es ist das, was die Leute sehen und woran sich Nicht-Java-Entwickler erinnern, wenn sie an Java denken.

Spike Williams
quelle
9

Java hat den Ruf, langsam zu sein , weil es war langsam. Die ersten Versionen von Java hatten entweder keine oder eine eher schlechte Just In Time-Kompilierung. Dies bedeutete, dass der Code, obwohl Bytecode, interpretiert wurde, so dass die Maschine selbst für die einfachsten Operationen (wie das Hinzufügen von zwei ganzen Zahlen) alle Arten von Vergleichen und Zeiger-Dereferenzen und Funktionsaufrufen durchführen musste. Der JIT-Compiler wurde ständig verbessert. Jetzt ist es an dem Punkt, an dem Java, wenn ich unachtsam C ++ - und unachtsam Java-Code schreibe, manchmal C ++ übertrifft, weil der JIT-Compiler erkennt, dass ich eine unnötige Zeiger-Dereferenzierung habe, und sich darum kümmert.

Wenn Sie sehen möchten, wie groß der Unterschied bei der JIT-Kompilierung ist, lesen Sie die interpretierten und nicht interpretierten Benchmarks im Computersprachen-Benchmark-Spiel . (Pidigits verwendet eine externe Bibliothek, um alle Berechnungen durchzuführen, damit sich der Benchmark nicht ändert. Die anderen zeigen eine 6-16-fache Beschleunigung!)

Das ist also der Hauptgrund. Es gibt eine Vielzahl anderer, weniger wichtiger Gründe, die nicht geholfen haben: Ursprünglich war die Startzeit von Java langsam (jetzt behoben); Das Herunterladen von Web-Apps in Java dauert lange (viel weniger wahr jetzt mit allgemein zugänglichem Breitband und mit großen Dingen wie erwarteten Filmen); Der UI-Swing wurde nicht (und wird immer noch nicht) mit Blick auf die Leistung geschrieben, daher ist er viel weniger bissig als Entsprechungen in z. B. C ++.

Rex Kerr
quelle
6

Java war damals langsam. Es ist aufgrund einiger Generationen von Leistungsverbesserungen viel schneller geworden . Zuletzt habe ich gehört, dass es normalerweise innerhalb von 10% der C # -Geschwindigkeit liegt - manchmal schneller, manchmal langsamer.

Der Start des Java-Applets ist immer noch langsam, da Sie eine ganze JVM starten müssen, die alle Klassen laden muss. Etwas wie das Booten eines anderen Computers. Sobald die JVM gestartet ist, ist sie ziemlich schnell, aber der Start ist normalerweise das, woran sich die Leute erinnern.

Es gibt auch mindestens einige Leute , die niemals an die Lebensfähigkeit von Java glauben werden.

Kaleb Brasee
quelle
1
Der JVM-Start ist leider immer noch viel langsamer als der CLR-Start. Dies liegt daran, dass Sun bei der Veröffentlichung von Java 7 auf die schlimmste Weise seine Füße
zerrissen hat
3
Wow, Java 6 ist 4 Jahre alt ??? Ja, ich denke schon (wenn Sie die Beta zählen). Fühlt sich für mich immer noch neu an - ich habe gerade aufgehört, 1.4 bei der Arbeit zu verwenden.
Kaleb Brasee
Java 1.4 ist brauchbar, aber irgendwie sucktastisch, da 1.5 und 1.6 viele Leistungssteigerungen und syntaktischen Zucker hinzugefügt haben. Seitdem wurden Bounds-Check- und System.arraycopy-Optimierungen eingeführt. Es gab also viele Verbesserungen bei der Synchronisation. Ich denke, es ist fair zu sagen, dass 1.4 wirklich langsam ist.
BobMcGee
LOL, ich weiß - jedes Mal, wenn ich manuell iterieren oder ein Array anstelle einer generischen Liste verwenden muss, möchte ich meinen Laptop in zwei Hälften teilen ... IBM hat Java 5 tatsächlich seit Jahren auf WAS 6.1 verfügbar, aber ich ' Ich habe Java 5/6 verwendet, seit es für meine eigenen Sachen herauskam, bin aber nur durch alte Serverversionen bei der Arbeit eingeschränkt. Es gibt zweistellige prozentuale Leistungsverbesserungen von 1.4 auf die neuesten Versionen für viele Dinge, und ich freue mich darauf.
Kaleb Brasee
6

Stefano:

Ich war von Anfang an mit Java beschäftigt, daher wurde aus meiner Sicht der Ruhm, langsam zu sein, durch nicht reagierende und langsame GUI-Frontends (AWT und dann Swing) und in Applets wahrscheinlich aufgrund der zusätzlichen langsamen Startzeiten des VMs.

Java hat eine Menge Forschung im VM-Bereich festgelegt und gefördert, und es wurden einige Verbesserungen vorgenommen, einschließlich der Speicherbereinigung (Sie können viele Dinge tatsächlich optimieren; häufig sehe ich jedoch Systeme, in denen nur Standardeinstellungen verwendet werden) und des Hotspots Optimierung (die zu Beginn und wahrscheinlich noch effizienter auf der Serverseite ist).

Java im Backend und auf Rechenebene ist nicht so langsam. Colt ist eines der besten Beispiele:

Die neueste stabile Colt-Version durchbricht die 1,9-Gflop / s-Grenze von JDK ibm-1.4.1, RedHat 9.0, 2x [email protected] GHz.

Es gibt viele Dinge außerhalb des Mainstream-Java, die berücksichtigt werden sollten, wie Echtzeit-Java oder spezielle Mechanismen zur Verbesserung der Geschwindigkeit wie Javolution sowie Ahead-Of-Time-Kompilierung (wie gcj). Es gibt auch ICs, die Java-Bytecode direkt ausführen können, wie zum Beispiel den in den aktuellen iPhones und iPods ARM Jazelle .

Ich denke, dass es heute im Allgemeinen eine politische Entscheidung ist (wie keine Java-Unterstützung auf dem iPhone / iPod) und eine Entscheidung gegen Java als Sprache (weil viele denken, dass es zu ausführlich ist).

Heutzutage gibt es jedoch viele andere Sprachen für die Java-VM (z. B. Python, Ruby, JavaScript, Groovy, Scala usw.), die eine Alternative sein können.

Persönlich genieße ich es weiterhin als flexible und zuverlässige Plattform mit hervorragenden Tools und Bibliotheksverfügbarkeit, die es ermöglicht, mit allem zu arbeiten, vom kleinsten Gerät (z. B. JavaCard) bis zu den größten Servern.

Dieter
quelle
Ok, ein weiterer schlechter Ruf kam vom GUI-Toolkit. Natürlich gehe ich davon aus, dass moderne JVM native Widgets verwenden und sich in die Betriebssystembibliotheken einbinden, oder? oder verwenden sie AWT / Swing, um das gleiche Erscheinungsbild der Host-Plattform zu erzielen?
Stefano Borini
Stefano: Swing basiert eigentlich auf der Idee des nicht-nativen universellen Renderns von Widgets, daher ist Ihre Annahme irgendwie falsch. Es handelt sich in der Tat um einen "steckbaren Look & Feel" -Mechanismus, mit dem Swing-Komponenten das Erscheinungsbild nativer Komponenten emulieren können. Wenn Sie nach so etwas suchen, sollten Sie sich SWT ( eclipse.org/swt ) ansehen , das sich tatsächlich in das native Betriebssystem einbindet und native Widgets mithilfe von JNI verwendet (was als Engpass bezeichnet wird).
Dieter
Java2D (für Swing verwendet) ist heutzutage sehr schnell und die Verwendung nativer Widgets (SWT) bietet keinen Leistungsvorteil. Zumindest habe ich das gelesen, als ich mich vor 6 Monaten für Swing oder SWT entschieden habe.
Luigi Plinge
4

Ein Hammer rollt Teig viel langsamer aus als viele andere Werkzeuge. Macht den Hammer nicht "langsamer" und auch nicht weniger nützlich für die Aufgaben, für die er entwickelt wurde.

Als allgemeine Programmiersprache ist Java bei einer Vielzahl von Programmieraufgaben vielen (wenn nicht den meisten) ebenbürtig. Es gibt spezielle, triviale Tests, bei denen Java handcodierte Lösungen in weniger anspruchsvollen Sprachen, die "näher am Metall" sind, nicht übertrifft.

Aber wenn es um "reale Anwendungen" geht, ist Java oft das richtige Werkzeug. Nichts hindert Entwickler daran, mit JEDEM Tool eine langsame Lösung zu entwickeln. Der Missbrauch von Tools ist ein bekanntes Problem (sehen Sie sich nur den Ruf von PHP und VB an). Das (meistens) klare Design und die Syntax von Java tragen jedoch wesentlich dazu bei, Missbrauch zu reduzieren.

mobiGeek
quelle
3

Java ist eine Hochsprache und hat heutzutage den Ruf, eine Leistung zu erzielen, die mit anderen vergleichbaren Hochsprachen vergleichbar ist.

  1. Es hat eine dynamische Bindungssemantik . Im Vergleich zu C ++, wo nicht virtuelle Methoden als Funktionsaufrufe kompiliert werden, muss selbst der beste Java-Compiler der Welt weniger effizienten Code erstellen. Es ist aber auch eine sauberere, übergeordnete Semantik.

  2. Ich erinnere mich nicht an die Details, aber ich hörte in den frühen Tagen von Java, dass es einen Mutex pro Java-Objekt gab, der von jeder Methode erfasst und freigegeben werden musste. Das macht es tendenziell besser an die Parallelität angepasst, obwohl leider nur ein Mutex pro Objekt Sie nicht vor Rennen oder Deadlocks oder den schlechten Dingen schützt, die in gleichzeitigen Programmen passieren können. Dieser Teil ist, wenn er wahr ist, ein wenig naiv, aber er kam aus guten Absichten. Fühlen Sie sich frei, mich über die Details zu informieren, wenn Sie mehr über diesen Aspekt wissen.

  3. Eine andere Art und Weise, in der Java eine Hochsprache ist, ist die Garbage-Collection . Die Garbage-Collection ist möglicherweise langsamer als mallocund freefür Programme, die gleichzeitig den gesamten benötigten Speicher zuweisen und damit arbeiten. Das Problem ist, dass Programmierer in Sprachen ohne Garbage-Collection dazu neigen, nur Programme zu schreiben , die den gesamten benötigten Speicher auf einmal zuweisen, und fehlschlagen, wenn sich herausstellt, dass eine beliebige maximale Größenkonstante übergelaufen ist. Der Vergleich ist also Äpfel zu Orangen. Wenn Programmierer sich bemühen, Programme mit dynamischer Zuordnung verketteter Strukturen in Nicht-GC-Sprachen zu schreiben und zu debuggen, stellen sie manchmal fest, dass ihre Programme nicht länger schneller sind als in einer GC-Sprache, weil mallocundfreesind nicht frei! Sie haben auch Overhead ... Außerdem müssen Sie nicht angeben, wer was freigibt, und wenn Sie angeben müssen, wer was freigibt, müssen Sie manchmal Kopien erstellen - wenn mehrere Funktionen die Daten benötigen und nicht klar ist, welche wird es zuletzt verwenden - während das Kopieren in einer GC-Sprache nicht notwendig gewesen wäre.

Pascal Cuoq
quelle
1. Wahrscheinlich nicht wahr mit HotSpot. 2. Nur wenn Sie die Methode als synchronisiert markieren.
Winston Ewert
1
1. Der Compiler optimiert den Code nicht, aber die JVM ist intelligent genug, um dynamisch zu bestimmen, dass normalerweise nur eine oder zwei virtuelle Methoden aufgerufen werden, die statisch oder sogar inline aufgerufen werden können. Ich bin mir ziemlich sicher, dass C ++ keine virtuellen Methoden einbinden kann. 2. Jedes Java-Objekt hat eine Sperre. Es hat einen kleinen Overhead (ungefähr ein Byte) für jedes Objekt, hat aber nur geringe Auswirkungen, wenn es nicht verwendet wird. 3. In Java können Sie alle benötigten Objekte gleichzeitig zuweisen. Dies kann Ihnen eine Anwendung geben, die nicht den ganzen Tag GC ist. ;) Javas GC ist implizit multithreaded, was spezielle Bibliotheken in C ++ erfordert.
Peter Lawrey
C ++ kann virtuelle Anrufe einbinden, Java kann dies jedoch in mehreren Fällen und ist auch bei der Optimierung megamorpher Anrufseiten stärker.
Piotr Kołaczkowski
2

Mitte der neunziger Jahre, als Java den Mainstream erreichte, war C ++ die dominierende Sprache, und das Web war noch ziemlich neu. Auch JVMs und GC waren relativ neue Konzepte in der Mainstream-Entwicklung. Die frühen JVMs waren etwas langsam (im Vergleich zu C ++, das auf Bare-Metal ausgeführt wurde) und litten auch unter manchmal langen Pausen bei der Speicherbereinigung, was zu dem Ruf führte, dass Java langsam ist.

Ken Liu
quelle
War dies auf die Technologie hinter dem GC zurückzuführen? Ich weiß, dass sie einige Strategien haben (wie Generationsschichten für Objekte), um in der GC-Phase effizienter zu sein. Was war damals die Strategie?
Stefano Borini
1
IANA JVM-Experte, aber ich denke, zu der Zeit gab es einen Single-Threaded-Mark / Sweep-Algorithmus für die GC, bei dem die gesamte JVM pausieren musste, während die GC durchgeführt wurde. Heutzutage gibt es gleichzeitiges Markieren / Sweep und es gibt auch viele andere Leistungsverbesserungen in der JVM.
Ken Liu
2
Moderne GC-Algorithmen sind nett, aber ich denke, dass die größte Verbesserung JIT war.
Pascal Thivent
1

Viele Java-Desktop-Apps (diesmal: Eclipse) reagieren schlecht auf die Benutzeroberfläche, wahrscheinlich aufgrund des hohen Speicherverbrauchs und der Tatsache, dass Classloader viele E / A-Vorgänge ausführen kann. Es verbessert sich, war aber vor einigen Jahren noch schlimmer.

Viele (die meisten) Leute machen gerne Verallgemeinerungen, also sagen sie "Java ist langsam", weil sie erkennen, dass die Apps langsam sind, wenn sie mit ihnen interagieren.

Wojciech Kaczmarek
quelle
Denken Sie, dass der hohe Speicherverbrauch vom Tool oder von den Java-Bibliotheken herrührt?
Stefano Borini
Im Fall von Eclipse - aus der Eclipse-Infrastruktur selbst. Gleiches gilt für "schwere" GUIs in der Vergangenheit (JBuilder, wie ich mich erinnere). Ich habe das Gefühl, dass viele Boilerplate-Objekte benötigt werden, um eine Plugin-Architektur (wie Eclipse) in einer statisch typisierten Sprache zu verwenden. Emacs hat auch Plugins und sein Speicherverbrauch ist 10-20x geringer als bei Eclipse, wenn typische Codierungen durchgeführt werden. Emacs Lisp-Code wird zu Bytecode kompiliert und in die Emacs-Instanz geladen und dann ausgeführt - ähnlich wie bei Java Classloader. Ich denke, in Java gibt es Tonnen von Zwischenobjekten, die instanziiert wurden, um eine gewisse Steckbarkeit zu ermöglichen.
Wojciech Kaczmarek
1

Das Hauptproblem bei Java - Anwendungen ist , dass es große aufgrund der großen Größe der Lager - Laufzeitbibliothek. Riesige Programme füllen viel Speicher und neigen dazu zu tauschen, was bedeutet, dass sie langsam werden.

Der Grund, warum die Sun JVM groß ist, liegt darin, dass sie über einen sehr guten Bytecode-Interpreter verfügt, der viele Dinge im Auge behält. Das bedeutet viel Daten, also Speicher.

Vielleicht möchten Sie sich die virtuelle Jamvm-Maschine ansehen, die ein relativ schneller Interpreter (kein nativer Code) und sehr klein ist. Es startet sogar schnell.

Thorbjørn Ravn Andersen
quelle
1

Wie Pascal sagt, ist Java anderen Hochsprachen ebenbürtig. Als jemand, der mit den ursprünglichen JVMs unter Windows 98 gearbeitet hat , war der Abstraktionsgrad der virtuellen Java-Maschine zu diesem Zeitpunkt jedoch schmerzhaft.

Grundsätzlich war es eine Software-Emulation mit wenig oder keiner Optimierung, die wir heute in der JVM für selbstverständlich halten.

Caskey
quelle
0

Normalerweise traben die Leute die Zeile "es wird interpretiert" aus. Denn es war einmal so, und schlechte Presse wird von Leuten weitergegeben, die Java als "zu langsam" eingestuft haben und nie zurückgekehrt sind, um neuere Versionen zu testen.

Oder vielleicht ist "Menschen sind Idioten" eine bessere Antwort.

Mr. Boy
quelle
0

Ich denke, eines Tages, vielleicht nicht in naher Zukunft, werden JIT-kompilierte Sprachen kompilierte Sprachen in jeder Hinsicht übertreffen (naja, vielleicht nicht Startzeit / Speicherverbrauch), da JIT-Compiler die Laufzeit stark nutzen können Verhalten und die Plattform, auf der sie laufen.

Hilfsmethode
quelle
6
Ich denke, was Sie damit sagen wollen, ist, dass JIT-kompilierter (nicht interpretierter) Code den AoT-Code schlagen wird. Die Interpretation ist immer langsamer als das Ausführen von kompiliertem Code. Aus diesem Grund werden JIT-Compiler verwendet. Der Haken: Es gibt kaum einen Unterschied zwischen einem Vorab-Compiler und einem JIT-Compiler in Bezug auf die Ausgabe, außer dass ein JIT-Compiler schneller kompilieren muss und Laufzeitinformationen verwenden kann, um auf seine Optimierungen hinzuweisen. Plattformspezifische AoT-Compiler mit plattformspezifischen Optimierungen schlagen JIT fast immer, da sie unbegrenzt viel Zeit für die Optimierung aufwenden.
BobMcGee
Vielen Dank für die Antwort, ich habe nie an die wenig Zeit gedacht, die JIT-Compiler zur Verfügung haben.
Hilfsmethode
Sie meinen, so etwas wie Hotspot adaptive Optimierung?
Stefano Borini
2
@ BobMcGee: Sehr richtig. Ein C ++ - Programm kann so erstellt werden, dass es langsam mit Profilfeedback für alle seine Vorgänge ausgeführt wird. Dann kann der Compiler eine sehr schnelle Version mit einer halben Stunde CPU-Zeit und 2 GB RAM neu erstellen. Eine JIT, die dies tat, würde die Benutzer dazu bringen, zu gehen.
Zan Lynx
1
Die JIT-Kompilierungszeit ist für lang laufende Apps wie Server vernachlässigbar. AOT mit PGO ist aus mindestens zwei Gründen im Vergleich zu JIT eingeschränkter. Erstens wird der größte Leistungsunterschied durch leichte Optimierungen erzielt. Vergleiche gcc -O2 mit gcc -O3. Meistens gibt es keinen Unterschied , manchmal kann -O3 etwas besser sein, manchmal etwas schlechter, aber ich habe nie einen> 2x Unterschied davon erlebt. Zweitens können Sie bei Verwendung von AOT auch mit PGO nur raten, wie das Profil auf der Verwendungsseite aussehen wird. Vermutlich falsch, und Sie sind weit hinter der JIT. Und das tatsächliche Profil kann extrem konfigurationsabhängig sein.
Piotr Kołaczkowski