Java hat in SO und an anderen Orten lange den Ruf, langsam zu sein. Von Witzen bis hin zu vielen Kommentaren in Fragen und Antworten glauben die Leute immer noch, dass Java langsam ist, allein aufgrund der Erfahrung mit Java in den 90ern.
Das ist mein Problem: Wir haben (die meisten) Gründe widerlegt, warum die Leute glauben, Java sei langsam. Abgesehen von kleinen Dingen ist Java ziemlich schnell.
Warum weigern sich die Leute, zu glauben, dass Java jetzt schnell ist? Ist es Teil ihrer Denkweise, dass alles, was nicht C / C ++ ist, langsam ist? Liegt es daran, dass die Leute nicht im Laufe der Zeit nachsehen? Liegt es daran, dass die Leute nur voreingenommen sind?
java
performance
TheLQ
quelle
quelle
Antworten:
Es sind die Anwendungen. Wie Sie bemerken, haben wir immer wieder bewiesen, dass Java-Code in erfundenen Szenarien die Leistung sogenannter "performanter" Sprachen wie C, C ++, Lisp, VB6 oder JavaScript erreichen oder sogar übertreffen kann . Und wenn solche Beweise vorgelegt werden, werden die meisten vernünftigen, aufgeschlossenen Gegner beschämt den Kopf hängen lassen und versprechen, niemals wieder solche Verleumdungen zu verbreiten.
... aber dann starten sie Eclipse, NetBeans oder Guiffy oder aktivieren die Java-Unterstützung in ihrem Browser oder versuchen, eine App auf ihrem bevorzugten Feature-Phone auszuführen. Und sie warten darauf, dass es anspricht ...
... und warten ...
... und warten ...
... und warten ...
... und warten ...
... und ...
... was habe ich versprochen, nie wieder zu tun ? Entschuldigung, muss eingenickt sein ...
quelle
Diese Frage funktioniert unter falschen Voraussetzungen: Wo es darauf ankommt, ist Java immer noch langsam. Wo es darauf ankommt, sind rechenintensive Algorithmen für große Datenmengen. Zugegeben, diese können optimiert werden, um manchmal mit C / C ++ - Code mithalten zu können, jedoch nur auf Kosten der Modularität und Generizität. Effizienter C ++ - Code kann so entworfen werden, dass er generisch ist und als universelle Bibliothek verwendet werden kann. Java-Code kann nicht. Schauen Sie sich nur die stark optimierte
Array.sort
Methode an, die für alle fundamentalen Typen unterschiedliche Implementierungen verwendet und deren Objektvariante immer noch viel langsamer ist als die von C ++,sort
da diese Objekte Gleichheitsvergleiche dynamisch ausgeben müssen.Zugegeben, Just-in-Time-Optimierungen, wie sie von der HotSpot-Engine durchgeführt werden, können das Ziel dieser virtuellen Anrufe vorhersagen und Inlining-Versuche durchführen. Dies ist jedoch immer noch langsamer als der direkt eingebundene Aufruf, der in der C ++ -
sort
Methode ausgelöst wird .Ein ehemaliger Kollege von mir hat mit einer C ++ - Templatimplementierung und einer objektorientierten Java-Implementierung Vergleichstests für ein Problem mit großen Datenmengen ( Q- Gramm-Zählung unter Verwendung dynamischer Formen) durchgeführt. Der Java-Code war um Größenordnungen langsamer als der C ++ - Code.
Das ist natürlich ein Vergleich von Äpfeln mit Orangen. Der Punkt ist jedoch, dass die Java-Implementierung die bestmögliche Implementierung war (in Bezug auf die Leistung in Anbetracht des für eine Bibliothek erforderlichen Modularitätsgrades), und ebenso die C ++ - Implementierung.
Leider sind die Benchmark-Daten nicht frei verfügbar, aber andere haben beim Vergleich des Overheads der Laufzeitabstraktion ähnliche Zahlen gefunden. Scott Meyers schreibt beispielsweise in Effective STL über den Overhead der generischen
qsort
Funktion von C :quelle
std::sort
ist einer der Fälle, in denen es schwierig ist, etwas Ähnliches in anderen Sprachen zu tun. Aber die überwiegende Mehrheit der Projekte, die ich gesehen habe, ist keinstd::sort
Code, der dem Schreiben ähnelt. Sie schreiben (schlechten) Java-Code in C ++ und beschweren sich über Probleme.Weil es langsam ist ... in einigen Anwendungen. Desktop-Anwendungen müssen von Anfang an reagieren, und der Startaufwand wird als gering eingestuft.
Wenn Sie jedoch einen Server betreiben, spielt es keine Rolle, ob eine gewisse Erwärmung vorliegt (JIT-Analyse und -Kompilierung) - Sie führen diese einmal in Blue Moon aus, sodass sie die meiste Zeit nicht als vollständig langsam angesehen werden kann.
quelle
Ich würde sagen, es ist so, weil es langsam war, als die Leute es zum ersten Mal erlebten. Darauf aufbauend haben sie sich einen Eindruck davon gemacht. Es ist unwahrscheinlich, dass sich dieser Eindruck ändert, wenn sie ihn nicht verwenden, und sie verwenden ihn aufgrund dieses Eindrucks nicht - es ist ein Teufelskreis.
Ich muss zugeben, ich hatte den Eindruck, dass Java langsam war, und ja, das war aus meiner vorherigen Exposition. Ich bin jetzt zu verschiedenen Sprachen übergegangen und habe seitdem nur eine äußerst eingeschränkte Erfahrung mit Java. Folglich hat sich an meiner Meinung nicht viel geändert.
quelle
Weil es eine Generation braucht, um die Wahrnehmung der Menschen über ein Produkt zu verändern
Es hat nichts damit zu tun, wie schnell Java wird. In den Köpfen der Menschen ist Java eine konstante Kennung, die mit dem Wort "langsam" assoziiert wird. Es gibt wenig, nichts, was Sie oder Oracle dagegen tun können.
Seien Sie einfach froh, dass Oracle die Java-Programmierkultur (noch) nicht zerstört hat, indem Sie etwas Unbesonnenes oder Dummes getan haben . Als würde man übermäßige Lizenzkosten erheben, um es zu nutzen. Oder Personen verklagen, die auf Softwarepatenten basieren, die zuvor im Besitz von Sun waren. ::Seufzer::
Ich hasse es, hier der Neinsager zu sein, aber wenn Oracle und Google den Java-Kampf nicht zu guten Konditionen beilegen oder Google gezwungen ist, Java zu kaufen und es zu einer "richtigen" Open-Source-Plattform zu machen, ist Java auf dem besten Weg, das Kind zu sein der Spielplatz, der Läuse hat. IE, niemand wird es mit einem 20ft Pol berühren wollen.
Hinweis: Nur um klar zu sein, wenn ich Generation sage, spreche ich in Begriffen von Menschen, nicht in Begriffen von Computern. IE, bis die Leute, die diese Vorstellung halten, vom Alter sterben oder durch eine jüngere Generation ersetzt werden, bleibt die Vorstellung zutreffend. Denken Sie in 5 Jahrzehnten und nicht in 5 Jahren.
quelle
Ein Grund ist, dass die Leute dem vertrauen, was andere sagen, anstatt dem, was sie sehen .
Nach dem, was mir gesagt wurde, als ich mit dem Programmieren anfing, ist Java "langsamer" als C ++, und der Grund, warum Java verwendet werden könnte, ist, dass es "bequem und einfacher" ist. Es wird allgemein angenommen, dass Java Sicherheit und Komfort auf Kosten der Leistung bringt. Selbst wenn später C # erfunden wird, glauben die Leute, dass es schneller als Java ist, weil es "nativ" ist.
Aber die Wahrheit, die die Leute sehen, ohne es zu spüren, ist, dass Eclipse, die mit Java erstellte IDE, absolut die SCHNELLSTE IDE in der Klasse ist. Ich habe fast alle Hauptstrom-IDEs verwendet, die von MS und GNU, Borland ..., Eclipse ist der absolute König der IDEs, vor allem, weil es schnell ist.
Ein weiterer Grund ist die lange Anlaufzeit .
Java ist nicht für die Entwicklung einer winzigen App geeignet, die in der Taskleiste verbleibt, wenig Speicherplatz beansprucht und ein Dialogfeld anzeigt, in dem Sie daran erinnert werden, eine Pause einzulegen. oder ein Notizblock, mit dem Sie eine Textdatei öffnen, lesen und schließen können. Es sollte auf einem BIG-Server verwendet werden, z. B. einem Webserver, der immer zur Verfügung steht, Ihre Computerressourcen optimal nutzt und auf Millionen von Anfragen pro Stunde reagiert. Oder eine IDE wie Eclipse, die Tausende von Arbeitsbereichsdateien verwaltet. Sie wissen nicht, dass Ihre Java-App schnell ist, bis sie mindestens mehrere Stunden gelaufen ist, glaube ich.
quelle
@bigown "Warum sagen die Leute immer noch, Java sei langsam?"
Weil sie dumm sind. Weil sie keine Berufserfahrung haben, aber denken, dass sie die lebendige Inkarnation von Dikjstra oder das zweite Kommen von Linus Torvald sind, oh ich weiß nicht. Es gibt so viele Gründe, warum man so etwas Verspätetes sagt, aber normalerweise scheinen Dummheit, sinnloser subjektiver Fanboyismus und emotionale Aufmerksamkeitshure dahinter zu stehen.
Untersuchen wir dies, damit Sie die Wahrheit über das sehen können, was ich gerade gesagt habe:
Erstens, was ist langsam, in welchem Kontext, für das, was unter welchen Bedingungen, mit dem, was Technik / Wissenschaft / Geschäftszweck (zu sagen tehe saugt es ist nicht einer von ihnen.) Wer sagt , für jede Technologie „X langsam“ X oder einfach "X ist Y", wobei Y eine Art negative Aussage ist, ohne eine der obigen Fragen zu beantworten, sollte als Dummkopf abgetan werden. Solche Aussagen haben keinen Platz im Engineering. In der Politik und in jugendlichen Chatrooms vielleicht, aber nicht in der Technik.
Zweitens weinen die meisten dieser fehlgeleiteten Dummköpfe darüber, dass Java langsam ist, weil ZOMG, ihre Sonnenfinsternis, ewig braucht, um hochzufahren (hey, lade das Ding mit all den Plug-Ins und rate, was passiert.). Die meisten dieser Dummköpfe wissen nicht einmal, wie um den JVM so zu optimieren, dass Eclipse schnell funktioniert (oder für jede andere Java-Anwendung). Das heißt, sie haben keine Ahnung von der Leistungsoptimierung, was nicht nur für Java, sondern für jedes nicht triviale System, sei es Hardware oder Software, Realität ist. Genau dort entschärfen sie sich für jede technische Gültigkeit, wenn sie solche sinnlosen Aussagen treffen.
Drittens wollen wir uns überlegen, wofür der Großteil der Java-Entwicklung bestimmt ist: in erster Linie Back-End-OLTP; Überwachungssysteme kommen an zweiter Stelle. Beide Systemtypen sollen in Clustern und für Wochen, wenn nicht Monate ohne Unterbrechung ausgeführt werden. Ist es dann wirklich wichtig, dass Ihre kleine Sonnenfinsternis oder Spielzeug-App ein oder zwei Minuten zum Laden benötigt, wenn der Zweck von REAL Java-Apps darin besteht, über einen längeren Zeitraum ausgeführt zu werden? Kontext, Menschen, Kontext.
Schließlich läuft das Backbone von OLTP bei Google und Ebay auf Java. Ich würde das als einen Beweis nehmen, der widerspricht, dass Java nicht langsam ist (zumindest für wichtige Bedingungen, nicht für kleine Spielzeugversuche, Benchmarks und nicht überprüfbare annekdotische Beweise, die speziell für den Zweck gemacht wurden, zu sagen, dass "tehe X langsam ist, es ist zum Kotzen".
Es gibt Technik und Fanboyismus. Ratet mal, zu welcher Kategorie solche Aussagen gehören?
quelle
-O2
) optimieren muss , damit C ++ akzeptabel schnell ausgeführt wird, ist Java langsam.it is slower than something else.
ein Jaguar langsamer ist als ein Gepard. Macht das erstereslow
? Versuchen Sie es mit technischer Objektivität und fragen Sie sich: Kann man logisch erklären,arbitrarily
dass etwasslow
einfach daran liegtit is slower
als etwas andereswithout mentioning a context of operations
, das definiert, was istfast enough
und wofür? Kannst du das logisch?Können wir dieses Thema ein für alle Mal schließen?
https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf [Scrolle nach unten zu Tabellen, Java ist 3,7-12,6-mal langsamer als C ++, Untersuchungen von Google-Mitarbeitern]
PS: Wenn dies nicht der Fall ist, nennen Sie mir zunächst mindestens eine bissige Java-App, die ich noch nie gesehen habe.
quelle
TMHO, dies liegt an der Zeit, die benötigt wird, um die VM im Browser zu starten. Wenn eine Anwendung langsam startet, werden sich die Leute nur daran erinnern. Denn lange Anlaufzeiten nerven wirklich. Ja wirklich. Einer meiner Kollegen sagte mir, dass er Firefox nicht benutzt, weil es zu langsam ist. (?!?). Aber, ja, ok, unter Windows braucht Firefox sehr viel Zeit, um angezeigt zu werden. Ihm zufolge ist diese App langsam, machte er sich Gedanken über die allgemeine Geschwindigkeit.
quelle
Langsam im Vergleich zu was? Ich denke über einen Wechsel von normalem Ruby zu JRuby (Java-basiertes Ruby) nach, weil ich gehört habe, dass es schneller ist.
quelle
Meinungen sind Meinungen und Fakten sind Fakten.
Hier ist eine Tatsache aus dem Google Code Jam, die Programmierer wohl dazu herausfordert, schwierige Computerprobleme in kurzer Zeit zu lösen. Daher spielt die Leistung der von ihnen verwendeten Sprache eine wichtige Rolle:
Während der letzten Ausgaben (2009, 2010, 2011) verwendeten rund 75% der Programmierer, die die letzten Runden erreichten, C ++, im Gegensatz zu rund 15%, die Java verwendeten.
Quelle -> http://www.go-hero.net/jam/
quelle
Circa 1997 habe ich einen HP Vectra VE (200 MHz) und Windows 95 verwendet. Die meisten Anwendungen liefen sehr schnell, aber dann habe ich ein paar Anwendungen ausprobiert, die in Java geschrieben wurden (IDEs, wenn ich mich richtig erinnere). Sie waren sehr langsam, zumindest die GUI-Teile von ihnen. Der Start dauerte lange, und die GUI-Elemente (z. B. Menüs) reagierten nicht sehr schnell - es gab Verzögerungen bei der visuellen Rückmeldung. Da Java-GUI-Anwendungen ein ziemlich charakteristisches Aussehen hatten, lernte ich, dieses Aussehen (und Java) mit schlechter Leistung zu verbinden.
quelle
Es kommt darauf an, was Sie als langsam bezeichnen.
Erstens hat Java in letzter Zeit viele Fortschritte gemacht und ist in den meisten Fällen sehr schnell. Aber :
Java ist übrigens in einigen Fällen schneller als Vanille C / C ++. Aber diese Sprachen bieten Ihnen die Werkzeuge, um sie zu optimieren.
Java ist eine auf Produktivität ausgerichtete Programmiersprache. Jetzt ist es für die meisten Anwendungen schnell genug, für einige andere jedoch nicht.
Im Allgemeinen ist Javas Langsamkeit ein überstrapaziertes Argument, da es in den meisten Fällen irrelevant ist.
quelle
Einfacher, kanonischer Java-Code ist in der Regel gleich oder schneller als einfacher, kanonischer C / C ++ / D-Code. Einfacher, kanonischer Code führt in der Regel unnötig viele Speicherzuweisungen aus, ist nicht besonders auf eine CPU-Architektur abgestimmt, es werden nicht viele Optimierungen auf niedriger Ebene vorgenommen usw. Javas HotSpot GC ist einfach nur erstaunlich, und die VM-Optimierungen sind in der Regel besser zu sein als ein statischer Compiler.
Auf der anderen Seite bietet C / C ++ / D viel mehr Möglichkeiten , wenn Sie wirklich Leistung benötigen und bereit sind, die Dinge von Hand zu optimieren, um sie zu erhalten. Sie können den Inline-Assembler in Java nicht verwenden. Sie können keine schmutzigen Punning-Tricks verwenden, um Gleitkommazahlen als Arrays von Bits zu behandeln. Sie können keine benutzerdefinierten Speicherverwaltungsschemata verwenden, die für Ihren speziellen Anwendungsfall möglicherweise schneller als der GC sind. Sie können in Java nicht annähernd so viel auf dem Stack zuordnen wie in C / C ++ / D. In Java ist die einzige Möglichkeit, etwas zu erreichen, das in etwa Funktionen höherer Ordnung entspricht, die Verwendung von Schnittstellen und die Bindung zur Laufzeit. In D und (ich denke, korrigieren Sie mich, wenn ich mich irre) C ++ können Sie Funktionen an Vorlagen übergeben, sodass die Bindung zur Kompilierungszeit ohne Flexibilitätsverlust erfolgen kann.
quelle
Ein weiterer Punkt für die "Langsamkeit" von Java ist die 64-Bit-Laufzeit.
Ich habe gehört, dass sich einige Leute darüber beschweren, dass Java auf 64-Bit-Computern für sie sehr langsam ist.
Wie sich herausstellt, verwendet die 64-Bit-Java-Laufzeitumgebung die Server-JVM, die vor dem Start das gesamte Programm kompiliert.HIER erfahren Sie, warum die 64-Bit-VM langsamer startet.
Zum Beispiel unter Windows:
quelle
Die Leistung von Java ist jedoch sehr subjektiv. Die Wahrnehmung, warum Java langsam ist, ist hauptsächlich auf Gründe zurückzuführen, die andere bemerkt haben: Die Wahrnehmung von etwas ist bei den meisten Menschen durch ihre früheren Erfahrungen geprägt, und Java war nicht immer eine gut optimierte Sprache die Haube. Ebenso ist Vanilla Eclipse keine besonders schnelle IDE und verblasst im Hinblick auf die Reaktionsfähigkeit im Vergleich zu einer IDE wie Visual Studio.
Abgesehen von den UI-Problemen, die Java beim Start hat, ist es für die meisten Anwendungen jedoch schnell genug. Wenn Sie suchen, können Sie Artikel finden , die sie mit anderen Sprachen vergleichen, und die meisten der präsentierten Ergebnisse bringen sie in den Bereich, in dem es nur dann zu Problemen kommt, wenn Sie mit wichtigen Datensätzen arbeiten.
Im Bereich der Bioinformatik wird es häufig verwendet, da es gut unterstützt wird und es bereits eine Installationsbasis gibt. Einer der Vorteile von Java besteht darin, dass Sie damit eine relativ schnelle Entwicklung durchführen können, die Sie mit C nicht durchführen können Wenn Sie sich die für die Bioinformatik verwendeten Sprachen ansehen (ich persönlich verwende regelmäßig R, Python und Java), werden Sie feststellen, dass keine von ihnen genau die schnellste ist und es nicht ungewöhnlich ist, dass die Datensätze in der Bioinformatik bis in die 100er reichen von Gigabyte an Informationen. Letztendlich ist die menschliche Zeit immer noch wertvoller, und obwohl die Geschwindigkeitsunterschiede spürbar sind, sind die Datensätze in der Regel so groß, dass sie ohnehin über Nacht ausgeführt werden.
Wenn es einfacher wäre, eine flotte Benutzeroberfläche in Java zu schreiben, würde die Geschwindigkeitswahrnehmung ziemlich schnell vom Radar fallen, da die meisten Leute nicht genügend Sprachen pushen, um die Geschwindigkeit täglich zu verbessern.
quelle
Wenn ich eine wertlose Münze einwerfe, stelle ich fest, dass Java-Webapps im Allgemeinen lange Start- und Reaktionszeiten haben, was Python oder Ruby meiner Meinung nach besser gemacht hätte.
Ich verwende Eclipse für den größten Teil meiner Programmierung, und ich muss sagen, dass Java genauso schnell ist wie alles andere, wenn nicht sogar lokal schneller und "eigenständig".
quelle
Ich würde sagen, Java ist unendlich langsam und nicht nur träge, da es keine einfachen Probleme löst, die in echten Hochsprachen einfach sind.
Lassen Sie mich ein einfaches Beispiel geben. Es gibt eine einfache Optimierung, die angewendet wird, wenn eine Liste zweimal zugeordnet wird, die Abholzung genannt wird: Hier ist die Regel dafür, die in meiner Sprache Felix geschrieben ist:
Das heißt: Anstatt die Liste x mit f abzubilden und sie dann erneut mit g abzubilden, sind zwei Listendurchläufe erforderlich und eine temporäre Garbage-Liste muss nur die Liste mit der Zusammensetzung der Funktionen zugeordnet werden.
Dies ist eine Optimierung auf hoher Ebene, die bei weitem wichtiger ist als die Leistung auf niedriger Ebene der Java-JVM. Die Spezifikation, die ich oben angegeben habe, ist nicht nur eine hübsche Syntax, sondern eine Anweisung des Benutzers, die dem Felix-Compiler mitteilt, wie eine Optimierung durchgeführt werden soll.
Bitte zeigen Sie mir, wie man so etwas in Java macht. Nein? Dann ist Java langsam. Sehr langsam. [Haskell kann das automatisch machen, glaube ich].
Und bevor Sie sagen "aber Java ist eine OO-Sprache, diese Art der Optimierung gilt nicht" .. Nun, das ist genau mein Punkt. Java ist zum Kotzen und OO zu sein ist einer der Hauptgründe.
Die JIT-Optimierung kann niemals annähernd mit den Optimierungen konkurrieren, die ein anständiger Compiler durchführen kann.
quelle