Warum ist Java so langsam und unflexibel?
-
Hallo !
ich muss schon dem Gregor teilweise rechtgeben... zuletzt habe ich ne bittere Erfahrung mit Java gemacht... ich finde Java sehr angenehm (klare Regeln etc.), jedoch finde ich die Performance schei... Ist es das, was man in Kauf nehmen muss, um "einfache Sprache" verwenden zu dürfen ?! Erstens wollte ich große binäre Dateien einlesen und in Objekten speichern. Da hatte ich mehrere komplexe Datentypen (verschachtelt versteht sich). Abgesehen davon, dass da Java urlange dafür gebraucht hat, war Java irgendwie nicht in der Lage Objekte zu löschen, wenn sie nimmer gebraucht wurden. Das hat Heap vollgemüllt ...
Vielleicht habe ich auch was falsch gemacht... aber der Test mit finalize() hat gezeigt, dass ich alles korrekt gemacht habe. Naja... die Javaprogs finde ich einfach langsam.
-
Selbst wenn ich mir jetzt den Zorn einiger Leute zuziehen sollte ...
Ich vergleiche das gerne mit folgender Situation:
Nehmen wir an, Du willst ein grosses Loch im Garten ausheben.- Dann kannst Du ne Schaufel nehmen, die ist einfach zu bedienen, aber es dauert halt auch was länger.
- Nimmst Du nen Bagger, geht das recht schnell, aber die Bedienung ist auch etwas komplizierter.
Stimmt vielleicht nicht so ganz, der Vergleich ... ist aber auch nicht so ganz ernst gemeint , also bitte nicht böse sein .
Gruss von
Qweety.
-
Der Vergleich ist etwas blödsinnig Java ist nicht wegen der Sprache selber oder weil es einfacher ist zwangsläufig langsamer als C++ , man könnte Java-Code so in Maschinencode umsetzen, daß es ähnlich schnell wie compilierter C++ Code ist. (Manche Sachen in Java sind sogar recht gut für die Performance, zB daß man überall nur Referenzen rumschickt und nicht Objekte by Value wie das in C++ möglich ist)
Das was in Java langsamer ist, ist daß der Code interpretiert und nicht direkt ausgeführt wird und daß es sehr viele Sicherheitsgeschichten gibt.. zb werden Arrays ständig auf Bereichsgrenzen gecheckt , sowas frißt alles Rechenzeit. Außerdem sind einige Teile der Standard-Java-Bibliothek nicht besonders toll für die Performance umgesetzt und Swing als GUI-Lib ist zwar schön zu programmieren, aber leider auch langsam
-
Original erstellt von crass:
Der Vergleich ist etwas blödsinnigNeeeee ... er ist sogar extrem blödsinnig :p !
-
Original erstellt von crass:
(Manche Sachen in Java sind sogar recht gut für die Performance, zB daß man überall nur Referenzen rumschickt und nicht Objekte by Value wie das in C++ möglich ist)
gerade objekte am stack sind doch um laengen schneller als welche am heapbtw: kleine objekte sind by value oft schneller als by reference
ich sehe also da nur vorteile fuer C++
wo ich vorteile fuer Java sehe ist, dass der GC schneller allokieren kann. die frage ist dann nur ob er auch zu sinnvollen zeiten die ressourcen wieder freigibt...
-
Original erstellt von crass:
**Java ist nicht wegen der Sprache selber oder weil es einfacher ist zwangsläufig langsamer als C++ , man könnte Java-Code so in Maschinencode umsetzen, daß es ähnlich schnell wie compilierter C++ Code ist.
**Genau das macht der JIT-Compiler von Sun ja mit der Zeit. Übrigens gibts auch Java-Prozessoren, wir können ja darauf mal Java gegen C antreten lassen
-
Original erstellt von crass:
und Swing als GUI-Lib ist zwar schön zu programmieren, aber leider auch langsamStimmt, die list leider sehr lahm. Aber die SWT-Umgebung aus dem Eclipse-Projekt demonstriert finde ich sehr schön, dass es auch in schnell geht Sollte sich ruhig mal mehr durchsetzen.
-
Original erstellt von TriPhoenix:
Genau das macht der JIT-Compiler von Sun ja mit der Zeit. Übrigens gibts auch Java-Prozessoren, wir können ja darauf mal Java gegen C antreten lassenBäh. C/C++ ohne Segfaults is doch langweilig *g*. Je nachdem wie die Prozessoren gebaut sind... wenn sie sich richtig nutzen lassen, bleibt C/C++ schneller. (Wenn der Programmierer fähig ist.)
-
gerade objekte am stack sind doch um laengen schneller als welche am heap
btw: kleine objekte sind by value oft schneller als by reference
ich sehe also da nur vorteile fuer C++
aber wenn ein großes Objekt (so 1KB) durch 5 Stationen duchgereicht werden soll, ist es sicher ein Vorteil wenn man nur die Referenz darauf rumschickt, anstatt das ganze Ding rumzokopieren.
Wieviel schneller Objekte auf Heap/Stack bearbeitet werden können weiß ich nicht..ist das ein großer Unterschied?Aber die SWT-Umgebung aus dem Eclipse-Projekt demonstriert finde ich sehr schön, dass es auch in schnell geht Sollte sich ruhig mal mehr durchsetzen.
stimmt schon daß SWT sehr schnell ist und auch wirklich natürlich aussieht, so daß man nicht auf den ersten Blick sieht, daß es mit Java gemacht worden ist (falls das schlimm ist;) ), aber andererseits muß ich Swing insofern verteidigen, daß es wirklich sehr durchdacht und schön gemacht worden ist und richtig Spaß macht zu coden. Wenn man früher wie ich WinApi gecodet hat , kommt einem daß vor wie wenn man vom Arbeitslager in den Himmel gekommen wäre:D
[ Dieser Beitrag wurde am 05.06.2003 um 11:26 Uhr von crass editiert. ]
-
Original erstellt von crass:
aber wenn ein großes Objekt (so 1KB) durch 5 Stationen duchgereicht werden soll, ist es sicher ein Vorteil wenn man nur die Referenz darauf rumschickt, anstatt das ganze Ding rumzokopieren.
Wieviel schneller Objekte auf Heap/Stack bearbeitet werden können weiß ich nicht..ist das ein großer Unterschied?in C++ kann man auch call by reference machen...
und fuer kleine sachen eben call by value.der unterschied ist teilweise schon stark:
ein objekt am stack ist in null komma nix angelegt, du musst nicht erst den speicher reservieren (bzw. muss der GC nicht nachsehen wo speicher frei ist und dann zuteilen und beim loeschen wieder freigeben...)weiters kostet jeder zugriff auf das objekt am heap eine indirektion mehr -> das ist nicht besonders schlimm, aber wozu soll ich das bezahlen wenn ich es nicht brauche?
vorallem kann das in zeitkritischen loops problematisch werden - zB wir haben einen iterator und wollen flux durchiterieren - dann sind diese indirektionen einfach zuviel
-
hmm...java is langsam ich merks grad weil ich es auf nem ersatzrechner (233mhz,64mb ram) installiert hab...weil mein großer abgekackt ist...
es brauch zum "compilieren" und interpretieren *****lange da ist ja selbst noch der hypermodernste c++ compiler ein wahres wunder an geschwindigkeit...bye
tt
-
Original erstellt von Gregor:
EDIT: Natürlich würde das Beispiel mit Java schneller gehen, wenn man sich selbst ne Liste für ints schreibt. ...wenn jemand Lust hat: Mich würde das Ergebnis interessieren!Ok. Habe ich mal probiert.
Wort vornweg:
- Sclagt mich nicht: die Implementation der Methode getNext() ist ziemlich schrott. Das weiss ich.
Ne Methode für wahlfreien Zugriff habe ich auch nicht und nen Iterator wollte ich auch nicht erst implementieren.
- Schimpft nicht darüber, dass der Code keinen Sinn macht. Habe es Just for Fun mal gemacht ;).- mein PC (AMD 2700+ @ 2.16 GHz)
- "alter" Java-Code: Zeit: 2470 ms
- dieser Java-Code : Zeit: 766 ms
- C++-Code : Zeit: 250 ms (musste double anstatt long long nehmen - mein Compiler kennt kein long long...:( )import java.util.*; public class ListTest2 { public static void main(String[] args) { long time = System.currentTimeMillis(); LinkedListForInt lList = new LinkedListForInt(); for (int i = 0; i < 1500000; ++i) { lList.add(i); } System.out.println("Zwischenzeit fuers adden: " + (System.currentTimeMillis() - time)); long a = 0; while(lList.hasNext()) { a += lList.getNext(); } time = System.currentTimeMillis() - time; System.out.println("Zeit in ms : " + Time); System.out.println (a); } } class LinkedListForInt{ private ListElem first = null; private ListElem last = null; private int size = 0; private ListElem tmp = null; private int lastGot = 0; public void add(int c){ if(size == 0){ first = new ListElem(c); last = first; } else{ last.setNext(new ListElem(c)); last = last.getNext(); } ++size; } public int getNext(){ //hier waeren mir static-Variablen für tmp und lastGot lieber als Member-Variablen //aber der Compiler frisst das nicht. (Das geht bei Java wohl garnicht so, wie bei C++ ?) //ein paar Exceptions sollten hier noch abgefangen werden, habe jetzt keine Lust dazu... if(lastGot == 0) tmp = first; else tmp = tmp.getNext(); ++lastGot; if(lastGot > size) lastGot = 0; return tmp.getContent(); } public boolean hasNext(){ return (lastGot<size); } public int getSize(){ return size; } } class ListElem{ private int content; private ListElem next = null; ListElem(){} ListElem(int c){ content = c; } void setContent(int c) { content = c; } int getContent() { return content; } void setNext(ListElem e) { next = e; } ListElem getNext() { return next; } }
[ Dieser Beitrag wurde am 14.06.2003 um 22:35 Uhr von fit editiert. ]