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.
java
performance
Stefano Borini
quelle
quelle
Antworten:
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:
quelle
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.
undCollections 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.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:
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.
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.
quelle
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.
quelle
Sie scheinen zwei ziemlich unterschiedliche Fragen zu stellen:
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.
quelle
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.
quelle
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.quelle
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).
quelle
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.
quelle
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 ++.
quelle
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.
quelle
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:
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.
quelle
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.
quelle
Java ist eine Hochsprache und hat heutzutage den Ruf, eine Leistung zu erzielen, die mit anderen vergleichbaren Hochsprachen vergleichbar ist.
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.
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.
Eine andere Art und Weise, in der Java eine Hochsprache ist, ist die Garbage-Collection . Die Garbage-Collection ist möglicherweise langsamer als
malloc
undfree
fü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, weilmalloc
undfree
sind 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.quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle