Sie scheinen zwei ziemlich unterschiedliche Fragen zu stellen:
- Ist Java wirklich langsam und wenn ja, warum?
- 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.