Java Anwendungen wieso grundsätzlich langsam?

tempomat

Mitglied
Hi Community,

mir ist aufgefallen, dass Java Anwendungen im Gegensatz zu anderen, z. B. C++ Anwendungen, langsam sind. Woran liegt das? Vielleicht am schlecht programmierten Code seitens der Programmierer?
 

zeja

Erfahrenes Mitglied
1. Java prüft Parameter die an Methoden übergeben werden und wirft Exceptions wenn dies nicht korrekt ist. Du erhältst eine ordentliche Fehlermeldung und weißt woher der Fehler kam. In C/C++ bricht dein Programm meist einfach ab wenn irgendein Fehler aufgetreten ist.
2. C/C++ arbeiten direkt auf dem Speicher, während Java dies kapselt. Es ist schneller einen Pointer weiterzusetzen als mit einem Iterator in Java zu arbeiten. Nachteil in C/C++ ist dass man den Speicher dann eben selbst verwalten muß und eventuell zu weit schreiben könnte.
3. Java hat nur ein Call-by-value und kein Call-By-Reference, d.h. Werte werden vor der Übergabe kopiert und nicht einfach ein Pointer auf den Speicher übergeben.

Das ist nur meine Meinung. Mag nicht alles richtig sein ;)
 

Wolfsbein

Erfahrenes Mitglied
3. ist schon mal falsch. Grundsaezlich ist es so, dass Bytecodesprachen (Java/C#) Zwischencode generieren, der on the fly in echten Maschinencode uebersetzt wird. Der Performanceverlust ist heute jedoch nur noch sehr gering.
 

muddin

Mitglied
Meiner meinung nach sind alle deine 3 Punkte falsch ;)
zu 1) kannst du mir ein Beispiel geben wie das aussehen soll?! Welche Exception soll da geworfen werden? Was hat das mit Performanz zu tun?
zu 2) Was meinst du mit "Direkt"? Kein Programm unter einem modernem Betriebssystem arbeitet "Direkt" auf dem Speicher, da hat das OS noch ein Wörtchen mitzureden.
zu 3) Quark! Es gibt keine Pointer in Java? Schon mal was von einer NullPointerException gehört? ;)
Zwischen Java und C++ gibt es nur minimale Geschwindigkeitsunterschiede, wenn überhaupt. Bei welchen Anwendungen ist es dir denn aufgefallen, wenn ich fragen darf?

mfg,
Muddin
 

Kyoko

Erfahrenes Mitglied
Ich denke, mit den Pointern meine er "richtige" Pointer wie in C. Java kennt keine solchen Pointer, nur Verweise auf Objekte, und diese fallen dem Programmierer eben nicht als "Pointer" auf.

Das ein Java-Programm langsamer ist als ein C Programm ist ganz klar (gleich guter Programmierstil vorrausgesetzt), Java wird eben in einer Virtuellen Maschine ausgeführt und ein C Programm läuft eben direkt auf der Hardware. Die virtuelle Maschine braucht eben auch ihre Rechenzeit, um die Java Anwendung auszuführen. Dieser Rechenaufwand ist zwar in letzter Zeit durch die immer schnelleren Prozessoren etc. immer vernachlässigbarer geworden, aber im Endeffekt braucht es eben doch länger!

Das gilt natürlich nicht nur für C, sondern für jede Programmiersprache, welche direkt zu Maschinencode kompiliert wird.
 

Grimreaper

Erfahrenes Mitglied
Ich bin auch der Meinung, dass Java bei Anwendungen mit einer GUI sehr viel langsamer ist. Bei Konsolenprogrammen sieht man gar keinen zu drastischen Unterschied, aber sobald ne GUI dazukommt bricht die Leistung ein. Siehe z. B. Azureus vs uTorrent.
 

KD3

Erfahrenes Mitglied
Ich denke mal an u.a JAP. An JAP kann man wirklich sehen, dass Java voll langsam ist. Die Portierung ist wohl gut, ja, aber trotzdem ist alles im Endeffekt langsam. Die Zeiger in C/C++ kann im moment denk ich mal garkeine andere Compilersprache überbieten und das ist ja der Grund wieso die Programme die in C oder C++ geschrieben wurden schneller laufen als in Java.

C++ FTW!! :D
 

Flex

(aka Felix Jacobi)
Ich als Windows Benutzer finde grundsätzlich die schlechte JVM unter Windows so lahm...
Unter Linux laufen die meisten Programme schneller... Bei gleicher Hardware.
 

zeja

Erfahrenes Mitglied
3. ist schon mal falsch. Grundsaezlich ist es so, dass Bytecodesprachen (Java/C#) Zwischencode generieren, der on the fly in echten Maschinencode uebersetzt wird. Der Performanceverlust ist heute jedoch nur noch sehr gering.

Ja richtig. Das ändert nur nichts daran, dass die JVM nicht genau weiß was du vorhast und es damit langsamer ist, als wenn du mit Pointern arbeitest.

Meiner meinung nach sind alle deine 3 Punkte falsch ;)
zu 1) kannst du mir ein Beispiel geben wie das aussehen soll?! Welche Exception soll da geworfen werden? Was hat das mit Performanz zu tun?

Schreiben über den Rand eines Arrays hinaus. In Java bekommst du eine ArrayIndexOutOfBoundsException in C/C++ einen Segfault. Java prüft eben die Grenzen des Arrays. Diese Prüfung kostet allerdings Zeit.

zu 2) Was meinst du mit "Direkt"? Kein Programm unter einem modernem Betriebssystem arbeitet "Direkt" auf dem Speicher, da hat das OS noch ein Wörtchen mitzureden.

Ja schon klar. Das was ich meine ist dass du mit einem Pointer++ sehr schnell über ein Array iterieren kannst.

zu 3) Quark! Es gibt keine Pointer in Java? Schon mal was von einer NullPointerException gehört? ;)

Schlecht gewählter Name...
Java has no pointers; this properly should have been called a NullReferenceException, but it stuck from the early days where C terminology held an unwholesome influence.
http://mindprod.com/jgloss/nullpointerexception.html

Dann erklär mir doch warum die RuntimeException so heißt...

Zwischen Java und C++ gibt es nur minimale Geschwindigkeitsunterschiede, wenn überhaupt. Bei welchen Anwendungen ist es dir denn aufgefallen, wenn ich fragen darf?

Echtzeitbildverarbeitung. So schnell wie in C++ kriegt man das in Java niemals hin. Eben weil ich mit den Pointer direkt auf dem Speicher arbeiten kann.

Ich bin auch der Meinung, dass Java bei Anwendungen mit einer GUI sehr viel langsamer ist. Bei Konsolenprogrammen sieht man gar keinen zu drastischen Unterschied, aber sobald ne GUI dazukommt bricht die Leistung ein. Siehe z. B. Azureus vs uTorrent.

Hmm jein.... bei Swing GUIs mag das sein. SWT GUIs sind nicht unbedingt viel langsamer. Swing GUIs werden eben von Java selbst gezeichnet. Während SWT Komponenten vom Betriebssystem kommen.

Vor allem sind aber viele GUIs wirklich schlecht programmiert, besonders wenn sie mit Threads arbeiten.

Ich als Windows Benutzer finde grundsätzlich die schlechte JVM unter Windows so lahm...
Unter Linux laufen die meisten Programme schneller... Bei gleicher Hardware.

Du meinst die JVM die Windows mit ausliefert?
 

tempomat

Mitglied
Kann man als Fazit sagen, dass Java nie in der Lage sein wird, so schnell zu arbeiten wie z. B. C++, und man daher bei komplexen Anwendungen lieber auf andere Programmiersprachen ausweichen sollte?

Oder wird das in der nächsten Zeit kein Problem mehr sein, denn neue Möglichkeiten werden entwickelt oder intelligente Verfahren eingesetzt: Threads

:)