Das ewige Thema Java-Performance



  • Hi,

    Anscheinend ist es eine ziemlich beliebte "mit ist langweilig was mach ich denn-ah genau Java wegen Performance niedermachen" Tätigkeit von allen Möchtegern-Programmierern die meinen mit Goto's noch 20 Nanosekunden aus ihrer 5 Seiten langen do-while loop rauszukriegen.

    Um die Sache auf den Punkt zu bringen: Klar, da Java zu sagen wir mal 20% interpretiert ist kann es nie so schnell sein wie eine kompilierte Sprache wie C++. Der Start der VM braucht seine Zeit und auch die ganzen internen Sicherheitschecks wie Array-Under/Overflow, sicheres down-casten oder explizites prüfen auf null dauert. Und es ist auch richtig dass Java 1.0, 1.1 ziemliche Gurken waren. Aber, und das kann man gar nicht oft genug betonen: Die Java-Entwickler holen Performance nach, und das in ziemlich großen Sprüngen. Ganz zu schweigen von den neuen HotSpot oder JIT Compilern.

    Kleine Tabelle zum Mitfreuen:
    JDK Version Faktor langsamer als C++
    Java 1.0 ca. 20-40
    Java 1.1 ca. 10-20
    Java 1.2 ca. 1-15
    Java 1.3 ca. 0.7-4
    Java 1.4 ca. 0.5-3 (meistens 1.2-1.5)

    Was hat sich an C/C++ in den letzten Jahren schon verändert? Nicht viel bedeutendes würde ich sagen. Die Einführung von using namespace std; war doch schon ein Kraftakt und ich weiß es zwar nicht, aber ich wette es gibt bestimmt noch Compiler die's nicht unterstützen(ja, sicher die bekannten Compiler wie VC++, MinGW, Borland haben's drin).
    Java hingegen wird stetig weiterentwickelt, z.B. Swing, verdammt war das zu Beginn eine Bremse, und jetzt? Es ist um einigest schneller geworden, und das ist nur ein Beispiel von vielen.

    Mit dem nächsten Sprung auf Java 5.0 kann man auch wieder erhebliche Verbesserungen erwarten.
    Die Performance kommt der von C++ immer näher. Ob sie erreicht wird ist fraglich, manche behaupten es wäre möglich Java schneller als C++ zu machen. Das glaube ich aber erst wenn ich's sehe.
    Witzigerweise sind die JVM's auch in C++ geschrieben, verzichten kann also auch auf C++ trotzdem nicht.

    Die Objektorierung frisst auch Zeit, wir können dem Objekt die Attribute nicht einfach rausreißen, sondern (wenn's richtig gemacht wurde) mittels setter/getter Methoden darauf zugreifen.
    Die Platformunabhängigkeit von C++ z.B. ist ein Witz da man es soweieso für jedes System neu kompilieren muss, klar dass es dadurch kompiliert und schneller als Java ist, aber hier hat Java ganz neue Standards gesetzt, auch wenn unter Win32 entwickelte GUIs unter Linux hin und wieder leicht abweichen.

    Aber da stellt sich eine andere Frage: Braucht man überhaupt noch die totale Performance?
    Ich meine, lassen wir die Games und Simulationsprogramme für Großrechner mal raus, einen 3 GHZ PC mit massig RAM und flotter HDD bekommt man für 700 EURO nachgeschmissen.
    Und dann fragt sich ob der 08-15 Büroangestellte beleidigt ist wenn er 10 Sekunden(Start der JVM) auf den Start seines Büro-Programms warten muss anstatt es gleich auf dem Desktop zu haben? Vielleicht ist er sogar froh dass er noch seinen Kaffee fertigtrinken kann.
    Ok, uns Programmier erfreut es zugegebenermaßen nicht gerade wenn z.B. die IDE ewig lädt (NetBeans, JBuilder), aber gemessen an der PC-nutzenden Bevölkerung sind wir eine echte Minderheit.
    Welchen pubertierenden Chat-Freak juckt es schon ob sein Java-Browser ein bisschen lahmer ist als das C++ Äquivalent?
    Ich will hier nicht das Schreiben von lahmen Programmen propagieren, aber diese ewige Performance-Jagd scheint mir langsam an Bedeutung zu verlieren.
    Ich würde ja nichts sagen wenn unsere Rechner noch 4 MHZ, 512 Kbyte RAM und 5 MByte HDD hätten, da ist es schon wichtig die Ressourcen zu nutzen, aber wenn alles im Überfluss vorhanden ist?

    Java(zumindest die J2ME) wurde schließlich auch für den Einsatz im kleinen Bereich mitkonzipiert (Kühlschrank, Handy...). Also kann es nicht so unperformant sein. Um genau zu sein ist der Basisinterpreter 40 KByte und zusätzliche Standardbibliotheken 175 KBte groß = macht 215 KByte. So klein ist keine andere Programmiersprache.
    Wenn man ein bisschen auf seine Programmierung achtet, z.B. mit static,private,final,new klug umgeht, dann kann man von Hand auch noch ein bisschen mitoptimieren.

    So, jetzt da meine Meinung steht könnt ihr über mich herfallen 😃

    In diesem Sinne



  • Das riecht nach Flamewar.



  • Jo, und mir scheint so, als wäre der Threadersteller nur halb über C++ informiert...



  • ich glaube dir scheint falsch, ich bin auch über C++ eingeweiht. Begründung deiner Aussage?



  • Ich habe her das Gefühl er verwechselt da die Unterscheidung zwischen dem Standard und den Compilern und diese werden ständig verbessert und der Standard wird ja gerade auch überarbeitet.

    Und wie soll ein Javaprogramm schneller sein als ein kompilliertes Programm? Dazu müsste die JVM entfernt werden und das javaprogramm ebenfalls kompilliert werden, da die JVM ganz einfach auch Zeit braucht welche sie dem Programm nunmal klauen muss.
    Und ich wage mal zu behaupten, dass es noch andere Interpreter in der Größe von 250kb gibt, so gibt es z.B. auch nen sehr sehr sehr kleinen Perl Interpreter (weiß jetzt nicht mehr den Namen, aber war auch so um die 200kb-250kb).
    Und es gibt auch Compiler die locker auf ne Diskette passen (und du sagst ja selbst man bekommt Top PCs geschenkt also ist der Speicherplatz eh egal).

    Und um ehrlich zu sein ich merke den Unterschied deutlich, so ist z.B. Eclipse sehr schnell, schaue ich mir andere Javaprogramme an merke ich doch deutlich, dass die GUI einfach langsamer als die von "normalen" Anwendungen ist. bei einer GUI aus dem .NET Framework kann ich das nicht feststellen (ebenso wie z.B. in Eclipse).
    Und ich find es gibt nix schlimmeres als ne lahme GUI, ich warte gerne bis ein Programm geladen ist und ich warte auch während es berechnet, aber ne lahme GUI hasse ich.

    Zu den GUIs muss ich aber auch sagen, dass man es bei Perl/TK ebenfalls bemerkt, außer man kompilliert das Programm dann nicht mehr.



  • GPC schrieb:

    ich glaube dir scheint falsch, ich bin auch über C++ eingeweiht. Begründung deiner Aussage?

    Du sagst "Was hat sich an C/C++ in den letzten Jahren schon verändert?". Mal abgesehen davon, dass du C und C++ in ihrer Entwicklung über einen Kamm scherst hat sich eine Menge verändert.



  • lol, dass ist wirklich dämlich was du schreibst. Nicht nur scheinst du keine Ahnung zu haben, du baust auch irgend eine Tabelle ein, die irgend was über Geschwindigkeiten aussagen soll. Ziemlich daneben und dann auch noch im falschen Forum



  • Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Rund um die Programmierung in das Forum Neuigkeiten aus der realen Welt verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ich habe geglaubt das hany von meinen bruder ist abgestürtz, das java spiel braucht 15 sekunden um zu starten
    naja das nur neben bei

    GPC schrieb:

    Mit dem nächsten Sprung auf Java 5.0 kann man auch wieder erhebliche

    ist nicht grade 1.5 aktuel?

    GPC schrieb:

    Aber da stellt sich eine andere Frage: Braucht man überhaupt noch die totale Performance?
    Ich meine, lassen wir die Games und Simulationsprogramme für Großrechner mal raus, einen 3 GHZ PC mit massig RAM und flotter HDD bekommt man für 700 EURO nachgeschmissen.

    1. wenn p2p, windows xp bonbon style, viren scenner, firewall, mail programm usw. im hintergund mit laufen ist performenc auch ein thema
    je mehr rechenleitung man hat desdo mehr programme will man gleichzeitig benutzen (oder besser toleriert sie im hintergrund)

    2. du darfs nicht davon ausgehen was du oder deine freunde für ein pc haben, in büros stehen immer noch hunderte <1GHz Rechner und sie funktionieren gut



  • Oh, wieder ein neuer Flamewar... 😃

    Also, zum Thema Geschwindigkeit von Java gegenüber C++:
    Klar, Java hat schon erhebliche Fortschritte gemacht, aber dass es schneller werden kann als C++ glaube ich eher nicht. Java hat gewisse Features, die es zwangsläufig ausbremsen. Durch Just-In-Time-Compiling wird das Problem des langsamen Interpretierens nach und nach ganz wegfallen. Aber der Garbage Collector frisst Ressourcen und die Bereichsprüfung bei Arrays braucht auch ihre Zeit. Zeiger (in C/C++) können sinnvoll eingesetzt auch die Geschwindigkeit steigern
    Noch was: Wo hast du deine Tabelle her?

    Müssen alle Anwendungen schnell sein?
    Na ja, es nervt schon, wenn z.B. OpenOffice (MS-Office ist auch nicht viel besser) ersteinmal ewig lädt. Genauso nervt es, wenn irgendwelche Mega-H4X0r meinen, sie müssten auf ihrer Webseite unbedingt einen Java-Newsticker einbauen, was den Browser beim ersten Aufruf der Seite unnötig ausbremst, weil er erst die JVM laden muss. Es geht mir nicht pauschal um alle Seiten, die Java verwenden, sondern nur um Webseiten, auf denen das nur eine unnütze Spielerei ist. Flash ist auch so ne Sache: Was ist, wenn jemand das PlugIn nicht hat (es gibt z.B. kein Flash-Plugin von Macromedia für FreeBSD) und sich eine Seite anschauen will, die eigentlich bloß ein Container für eine Flash-Animation ist? Ok, das war etwas OT, aber ich konnte es mir nicht verkneifen.
    Ein weiteres Problem besteht darin, dass nicht alle einen 3GHz-Monsterrechner haben und sich nicht jedes Jahr einen neuen Rechner kaufen wollen. Deshalb ist Performance schon wichtig. Schau dir nur mal die Anforderungen von Windows Longhorn an, dann weißt du, was ich meine. Viel Geschwindigkeit geht auch wegen sinnlosen Spielereien drauf, da kommt es gar nicht so sehr auf die verwendete Sprache an.

    Zur Plattformunabhängigkeit:
    Das ist wirklich ein immer wichtiger werdendes Thema, besonders in Zeiten, in denen Linux und andere alternative Betriebssysteme mehr Zulauf finden. Aber man muss sagen, da hat sich schon ziemlich viel getan: Mit gtk+/gtkmm oder wxWindows kann man schon ganz gut portable Programme schreiben. Ok, neukompilieren muss man schon noch, aber mal ehrlich: Ist das wirklich so schlimm? Wenn man klug programmiert, ist das doch kein Problem und der Zeitaufwand ist im Verhältnis zur Entwicklungszeit auch eher gering. Man braucht einen Compiler für die entsprechende Plattform, das ist das eigentliche Problem, aber notfalls lässt man sich das Programm z.B. vom Linuxuser seines Vertrauens kompilieren. Testen sollte man Java-Programme sowieso auch auf anderen Plattformen, wenn man es mit der Plattformunabhängigkeit ernst meint (die Tücke steckt bei Java im Detail).



  • GPC schrieb:

    Die Performance kommt der von C++ immer näher. Ob sie erreicht wird ist fraglich, manche behaupten es wäre möglich Java schneller als C++ zu machen. Das glaube ich aber erst wenn ich's sehe.

    das ist keine frage der sprache.
    das liegt mehr an der programmstruktur und der fähigkeit des compilers den code zu optimieren. man kann ohne probleme 2 programme basteln die das gleiche tun, eins in java, eins in c++ und das c++ -prg ist viel langsamer weil es grützig programmiert wurde.

    GPC schrieb:

    Witzigerweise sind die JVM's auch in C++ geschrieben, verzichten kann also auch auf C++ trotzdem nicht.

    nee, sonst bräuchte die jvm ja eine zweite jvm und die wiederum eine usw.
    aber java-compiler könnte man prima in java selbst coden. das macht sun aber nicht, weil sie nicht komplett alles neu schreiben wollen.

    GPC schrieb:

    Ok, uns Programmier erfreut es zugegebenermaßen nicht gerade wenn z.B. die IDE ewig lädt (NetBeans, JBuilder), aber gemessen an der PC-nutzenden Bevölkerung sind wir eine echte Minderheit.

    ich nehme nur jcreator. ist zwar ein spartanisches tool aber hat wenigstens nicht so'n speicherhunger wie netbeans, eclipse und so'n zeugs.

    GPC schrieb:

    Java(zumindest die J2ME) wurde schließlich auch für den Einsatz im kleinen Bereich mitkonzipiert (Kühlschrank, Handy...). Also kann es nicht so unperformant sein. Um genau zu sein ist der Basisinterpreter 40 KByte und zusätzliche Standardbibliotheken 175 KBte groß = macht 215 KByte.

    wobei du nicht vergessen darfst. dass in solchen handies fette 32-bit controller eingesetzt werden, mit einigen mb an speicher. für die ist das kein problem

    GPC schrieb:

    So klein ist keine andere Programmiersprache.

    wenn man richtig kleine systeme beharkt geht (ausser assembler) nur c (ohne ++). auf solchen systemen sieht java kein land.



  • Gerard schrieb:

    ist nicht grade 1.5 aktuel?

    Nein, die aktuelle Version heißt tatsächlich 5.0. Die haben wohl ein paar Versionsnummern übersprungen.



  • Es gibt schon seit ner Ewigkeit C für µController. Seit wann gibt es nochmal Java auf Handys? :p



  • net schrieb:

    aber java-compiler könnte man prima in java selbst coden. das macht sun aber nicht, weil sie nicht komplett alles neu schreiben wollen.

    javac wurde in Java geschrieben.

    Wir könnten Wetten abschließen, wie viele Seiten der Thread hier bekommen wird. Ich tippe auf 5 (ein MOD könnte mir ja helfen und wir teilen dann den Gewinn) 😃



  • interpreter schrieb:

    javac wurde in Java geschrieben.

    wow, hätt ich nicht gedacht.



  • Juchu,

    wieder ein Thread, der die Welt verändert. Ich tippe mal auf ca. 15-20 Seiten, bevor er geschlossen wird. 🕶



  • CarstenJ schrieb:

    Ich tippe mal auf ca. 15-20 Seiten, bevor er geschlossen wird. 🕶

    Intervalle sind unfair 🤡



  • Ok, 18 Seiten! 😉



  • CarstenJ schrieb:

    Ok, 18 Seiten! 😉

    ich tippe auf 4 seiten
    aber dann wird er nicht geschlossen, sondern es kommt nichts neues mehr



  • CarstenJ schrieb:

    Ok, 18 Seiten! 😉

    :p
    Das ist die einzig sinnvolle Methode, wie man auf so einen Thread reagieren kann: Ihn mit OT Postings ins Lächerliche ziehen 🕶


Anmelden zum Antworten