JAVA schneller als C++ ? Stimmt das???
-
Gregor schrieb:
groovemaster schrieb:
Optimizer schrieb:
Das Konzept der JIT-Compilierung ist insgesamt völlig überlegen.
Quellen?
Bestimmt kommt er gleich wieder mit dem Somasegar-Blog!
Ne, ich find schon noch was anderes geiles.
-
Gregor schrieb:
Hmmm... ich bin eigentlich relativ stark gegen SWT eingestellt. Es mag schon sein, dass SWT ein bischen Performance bringt und es mag auch sein, dass sich eine SWT-GUI "nativer" anfühlt. Aber irgendwie bin ich der Meinung, dass es das nicht wert ist. Ich musste mal etwas mit SWT arbeiten und habe da den Eindruck erhalten, dass die Bedienung von SWT zum k***** ist. ...für den Entwickler meine ich. Zudem muss man sich bei SWT um Dinge kümmern, die Java-untypisch sind. Resourcenmanagement usw.. Und als Sahnehäubchen kommt dann auch noch, dass man seine Software für jede Plattform getrennt anbieten muss und die jeweils passende SWT-Version dazupacken muss. Das alles führt bei mir zu dem Eindruck, dass SWT nicht wirklich zu Java passt.
Moment, ich bin keinesfalls ein SWT-Verfechter oder so
Ich habs noch nicht mal wirklich verwendet beim Entwickeln, aber ich durfte mal im selben Raum sitzen mit einem, der damit ein Plugin für Eclipse schreiben musste. Man hat der geflucht
Ich hab das eigentlich eher aus Benutzersicht geschildert und da existiert IMHO schon eine Verbesserung von SWT gegenüber Swing.
Vor allem sollte man bei Swing auch bedenken, dass nicht jeder die neusten High-End PCs hat und da reichen auch schon leichtgewichtigere Swing-Anwendungen um den PC in die Knie zu zwingen, wobei derselbe PC mit MFC/WinAPI locker fertig werden würde.
Prinzipiell finde ich Swing auch ne tolle Sache, vor allem beim Entwickeln. Das ist, wie schon gesagt, äußerst angenehm da ne GUI zusammenzubastelnAber eben da liegt bei vielen Java-Anwendungen IMHO eben auch das, was sie langsamer macht. Aber vielleicht ändert sich ja wirklich was in Zukunft daran.
-
net schrieb:
Optimizer schrieb:
Wobei sich der Sinn mir nicht ganz erschließt.
der sinn eines chips, der java bytecode direkt ausführen kann? oder was?
Optimizer schrieb:
Ja, genau. So war es gemeint.
man braucht keine extra stück software (virtual machine) um den code auszuführen. das musste dir ungefähr so vorstellen, als wenn dein ganzes windows einschliesslich aller anwendungen ständig in vmware, swista, virtual pc o.ä. laufen würde. du belastest die hardware zu 100%, bekommst aber nur 60% der rechenleistung. obwohl man sich daran gewöhnen kann ist das ganze verhalten ziemlich träge und programme starten sehr langsam im vergleich zum original. so ein java chip ist z.b. gut für j2me enabled devices, allein schon wegen des geringeren energieverbrauchs...
-
Optimizer schrieb:
Ok, wir sind uns einig, betrachten wir das von der theoretischen Seite. Dann erklär jetzt nochmal genau, wie JIT-Compilierung die Performance negativ beeinflusst.
nicht der JIT an sich, sondern das ganze system an sich sorgt für schlechte performance, weil das programm erstmal in bytecode und anschliessend in maschinencode (mittels JIT) umgewandelt wird. alle optimierungen die man vom eigentlichen source bis zum microcode sonst "weiß" werden durch erzeugung von temporärem bytecode nirgenswo hinterlegt und sind weg. möchte man durch ein array durchitterieren, ist der schnellste weg bei einer ARM-cpu der tödlichste für eine x86-cpu und umgekehrt sieht es änlich unoptimal aus. das ließt ein compiler natürlich aus dem source und generiert dann microcode der am besten für die cpu ist oder bytecode ins blaue hinaus (und der JIT kann danach nichts tolles mehr machen, weil ihm die informationen fehlen).
um es auf das menschliche dasein zu übertragen: ich erzähle einen witz auf deutsch, eine zweite person schreibt sich alle wörter die dabei auftreten auf und übersetzt sie 1:1 ins englische und du als JIT der vom ursprünglichen witz nichts weiß und nur english kann ließt das. ich hoffe du kannst dir vorstellen wieviel witzinformation am ende in deinem hirn ankommt.
Optimizer schrieb:
Die besagt, dass nur 20% des Codes eines Programms für die Performance von Bedeutung sind. Diese 20% sind harte Numbercrunching-Aufgaben wie Raytracing, wenn du einen 3D-Modeller schreibst. Und nicht die 80% des Codes, die das GUI und das Speichern der Benutzereinstellungen, usw. ausmachen. Das steht im Gegensatz zu deiner Ansicht, dass Performance durchgehend im ganzen Programm an jeder Stelle wichtig ist.
wie auch das moor'sche gesetzt, wird diese regel auch sehr oft total falsch interpretiert.
die 20:80 regel beziehen sich auf code an sich, nicht auf ein ganzes programm. 20% vom code ist performancerelevat. also 20% vom mubercrunching (vielleicht der teil, der dividiert?), 20% der gui(könnte der teil der rendert sein?) und 20% vom code für einen button der gui (könnte auch seine render/paint funktion sein?). dementsprechend kann sowohl das "Numnrcrunchen", GUI oder auch die mousebuttonabfrage sehr viel mehr performance kosten als es sein müßte. (bestes beispiel sind viele java apps mit swing sowie c# apps und deren guilib, die großteile der performance fressen und nicht das "numbercrunching" an sich ).Optimizer schrieb:
Optimizer schrieb:
Nein.
Nein? Aber sicher doch! Ein C++ Compiler _kennt_ die Plattform, für die er kompiliert.
Nein. Er kennt sie nicht gut genug.
er weiß besser wie er den source über die einzelnen stufen hinweg zu microcode umwandelt als es der javacompiler+JIT wissen können.
Optimizer schrieb:
Optimizer schrieb:
Man compiliert auch nie 20 verschiedene Versionen für 20 Prozessoren (ich habe das noch nie gesehen). Stattdessen fasst man fast alle x86-Prozessoren in einem Build zusammen
Wer redet denn von Prozessoren? Die Rede war von Plattformen, und da ist der Prozessor nur ein Teil. Du kannst in einem Windows und Linux System den gleichen Prozessor haben, trotzdem brauchst du zwei Kompilate. Selbst für ein und dieselbe Plattform habe ich schon unterschiedliche Kompilate gesehen, zB wenn eine Anwendung eine Basic Binary und eine Binary mit Support für diverse CPU Befehlssatzerweiterungen anbietet. Aber das ist schon wieder zu sehr OT. Fakt ist, ein C++ Compiler und die damit beiliegende Runtime kennen die Plattform. Wäre ja auch sonst zu blöd, wenn die CPU den Maschinencode gar nicht "verstehen" oder das BS die Executable gar nicht laden könnte.
Der Punkt war: Man fasst in der Regel zusammen, was man kann. Man compiliert nicht für Pentium I, II, III, IV, 4 D (mit x64) mal Windows 9x, NT, Linux, macht insgesamt 15 Compilate ohne AMD. Zeig mir eine ernstgemeinte Software, für die es so viele Compilate gibt.
macht der Intel Compiler automatisch und beim start wird das jeweilige codestück ausgewählt, dass am besten für eine cpu ist. mit einem hack (hat heise irgendwo auch genauer beschrieben), kann man patchen, dass auch das best passendste binary für AMD-cpus genommen wird. nebenbei gibt es diese "BigBinaries" schon länger, hatte z.b. apple bei umstellungen auf neue cpus benutzt und afaik gibt es bei WinCE auch diese vorgehensweise um möglichst viele cpus zu unterstützen. es gibt natürlich auch die möglichkeit binaries im voraus oder zur laufzeit auf neue cpus umzustellen (so wie es in etwa am anfang bei java war bzw mit JIT läuft), wurde/wird z.b. beim itanium gemacht um x86-code auszuführen.
Optimizer schrieb:
Optimizer schrieb:
Es gibt Variablen, die beim Programmstart nur einmal ausgelesen werden und sich amsonsten nicht mehr ändern. Ein C++ Compiler kann dies nicht nutzen.
Wieso nicht? Und selbst wenn, was wäre dabei der Nachteil?
Wieso nicht? Weil der Compiler vor dem Programmstart ins Spiel kommt. Ist doch ganz klar!
genau wie java, gibt es auch bei anderen sprachen die möglichkeit den ersten durchlauf mit profilling durchlaufen zu lassen, dann weiß der compiler das und kann im zweiten pass drüber gehen und diese problemstellen wegoptimieren.
Optimizer schrieb:
Optimizer schrieb:
Ein JIT-Compiler kann auch viel öfters feste Speicheradressen bilden, für die ein statische Compiler eine Indirektion einbauen muss. Das betrifft insbesondere die Fälle, wo man dynamisch was hinzulinkt.
Was verstehst du denn unter "festen Speicheradressen"?
Beispielsweise ich lade ne DLL hinzu, die kommt an irgendne Basisadresse im Textsegment. Jetzt rufe ich darin ne Funktion auf. Mein Programm wurde jetzt aber schon compiliert, also muss es die Adresse der Funktion ausrechnen, Basisadresse + Funktionsoffset. Bei JIT-linking wüsste ich nach der JIT-compilierung, wo die Funktion der DLL im Speicher steht und kann während der JIT-compilierung meines Codes direkt die Adresse eintragen.
afaik wird beim laden einer dll beim programmaufruf, jede auf die dll referenzierende stelle im programm mit der richtigen address der funktionen der dll überschrieben, so wie es der jit macht (find ich auch seltsam, aber hab ich auf irgend ner msdn seite gelesen, drum glaub ich das). man hat aber den vorteil, dass nicht in einer virtuellen umgebung diese arbeit durchgeführt wird, sondern im OS, was das mehrmalige laden von modulen erspart.
Optimizer schrieb:
Optimizer schrieb:
Ich schreibe immer "JIT-Compiler", der eigentliche Punkt ist aber auch, dass sämtliches Linking zur Laufzeit stattfindet. Das bringt erhebliche Vorteile beim hinzufügen von Laufzeit-Bibliotheken.
Da möchte ich dir ja auch gar nicht widersprechen, zumindest was Codeoptimierung betrifft. Aber wie sieht es zB mit Portabilität aus? C Bibliothen kann man zB auch problemlos mit diversen anderen Sprachen nutzen.
Ähm weiß nicht. Die Portabilität des Bytecodes ist jedenfalls nicht schlechter.
welche sprache außer java generiert denn noch bytecode für den JIT ?
Optimizer schrieb:
Optimizer schrieb:
Das Konzept der JIT-Compilierung ist insgesamt völlig überlegen.
Quellen?
Ich bin der Anfang (und das Ende). Ich habe es doch begründet. Wie gesagt, wir betrachten des ja von der theoretischen (der einzig sinnvollen) Seite. Der Wirtschaftler sagt natürlich "des Programm war jetzt in C++ geschrieben 5% schneller", ob einfach nur der Compiler besser war, findet er nicht so wichtig. Es gibt eine Menge weitere nicht-Performance Gründe, warum JIT-Compilierung auch einfach viel einfacher ist, im Zusammenhang mit Bibliotheken, die eben nicht nur aus C-Funktionen bestehen, sondern Klassen bereitstellen, von denen man ableiten können soll, usw... es geht alles irgendwie über 20 Indirektionen, aber JIT-Compilerung ist der bessere Weg, weil der Compiler dann sowohl das Hauptprogramm als auch die Lib vor sich liegen hat.
es ist aus meiner sicht der schlechtere weg. der c++ compiler hat alle sourcen meistens zur verfügung um daraus das beste binary zu generieren. DLLs und andere module sind meist komplett abgeschlossene bereiche mit schnittstellen, die nicht performancekritisch sind. alles was performancekritisch ist, ist meistens in einem binary für sich und es wurde aus dem source direkt ins binary optimiert. bei java wird meines wissens nach jede klasse zu einem bytecode-objekt und danach erst mit JIT zusammengefasst, an der stelle des byte-objekts ist bei c++ hingegen schon jede optimierung gelaufen und würde selbst mit einem JIT nichts mehr reissen können.
java wurde entwickelt um
1. bei niedrigem programmierniveau sicheren coden zu gewährleisten (kostenersparnis)
2. möglichst extrem flexibel zu sein durch eben modularisierung (kostenersparnis)
3. leicht portierbarkeit "Write once, run everywhere" (mehr potentiellen markt -> größere margen)java wurde nicht entwickelt um
1. schnell zu sein und ne performancekrone zu erhalten (im gegenteil, wurde anfangs nur mit interpretern ausgeliefert und mußte später JITs erhalten, damit es nicht 10x langsammer läuft als andere sprachen, nachdem MS für j++ soeinen erstellte)
2. um c++ zu ersetzen (im gegenteil, wichtier code soll weiterhin von hoghqualifizierten kräften in c/c++ erstellt werden z.b. SunOS)
3. allround eingesetzt zu werdendeswegen sollte man erst garnicht versuchen java als schneller darzustellen, ist wie ein vergleich eines ferraris mit einem trecker und der versuch mittels der ps-zahl die mögliche endgeschwindigkeit abzuschätzen.
mal ganz ehrlich. wenn man ein "perfektes" programm für sich haben möchte, stellt man nen hochqualifizierten coder ein und lässt es ihn in c++ machen und zahlt entsprechend (weil man etwas gutes haben möchte und für soviel geld dann auch verlangen darf dass es kein speicherfresser ist). wenn man ein "perfektes" programm für den markt haben möchte, weil es irgendjemand benutzen soll der dafür geld ausgibt, dann stellt man sich zwei studenten/praktikanten ein und lässt sie es in java/c# schreiben und spart geld und kann sich sicher sein, dass das programm, egal wie es laufen wird, wohl keine accessviolations werfen wird (weil man $$$ machen möchte)
greets
rapso
-
rapso schrieb:
Optimizer schrieb:
Ok, wir sind uns einig, betrachten wir das von der theoretischen Seite. Dann erklär jetzt nochmal genau, wie JIT-Compilierung die Performance negativ beeinflusst.
nicht der JIT an sich, sondern das ganze system an sich sorgt für schlechte performance, weil das programm erstmal in bytecode und anschliessend in maschinencode (mittels JIT) umgewandelt wird. alle optimierungen die man vom eigentlichen source bis zum microcode sonst "weiß" werden durch erzeugung von temporärem bytecode nirgenswo hinterlegt und sind weg. möchte man durch ein array durchitterieren, ist der schnellste weg bei einer ARM-cpu der tödlichste für eine x86-cpu und umgekehrt sieht es änlich unoptimal aus. das ließt ein compiler natürlich aus dem source und generiert dann microcode der am besten für die cpu ist oder bytecode ins blaue hinaus (und der JIT kann danach nichts tolles mehr machen, weil ihm die informationen fehlen).
um es auf das menschliche dasein zu übertragen: ich erzähle einen witz auf deutsch, eine zweite person schreibt sich alle wörter die dabei auftreten auf und übersetzt sie 1:1 ins englische und du als JIT der vom ursprünglichen witz nichts weiß und nur english kann ließt das. ich hoffe du kannst dir vorstellen wieviel witzinformation am ende in deinem hirn ankommt.
Optimizer schrieb:
Die besagt, dass nur 20% des Codes eines Programms für die Performance von Bedeutung sind. Diese 20% sind harte Numbercrunching-Aufgaben wie Raytracing, wenn du einen 3D-Modeller schreibst. Und nicht die 80% des Codes, die das GUI und das Speichern der Benutzereinstellungen, usw. ausmachen. Das steht im Gegensatz zu deiner Ansicht, dass Performance durchgehend im ganzen Programm an jeder Stelle wichtig ist.
wie auch das moor'sche gesetzt, wird diese regel auch sehr oft total falsch interpretiert.
die 20:80 regel beziehen sich auf code an sich, nicht auf ein ganzes programm. 20% vom code ist performancerelevat. also 20% vom mubercrunching (vielleicht der teil, der dividiert?), 20% der gui(könnte der teil der rendert sein?) und 20% vom code für einen button der gui (könnte auch seine render/paint funktion sein?). dementsprechend kann sowohl das "Numnrcrunchen", GUI oder auch die mousebuttonabfrage sehr viel mehr performance kosten als es sein müßte. (bestes beispiel sind viele java apps mit swing sowie c# apps und deren guilib, die großteile der performance fressen und nicht das "numbercrunching" an sich ).Optimizer schrieb:
Optimizer schrieb:
Nein.
Nein? Aber sicher doch! Ein C++ Compiler _kennt_ die Plattform, für die er kompiliert.
Nein. Er kennt sie nicht gut genug.
er weiß besser wie er den source über die einzelnen stufen hinweg zu microcode umwandelt als es der javacompiler+JIT wissen können.
Optimizer schrieb:
Optimizer schrieb:
Man compiliert auch nie 20 verschiedene Versionen für 20 Prozessoren (ich habe das noch nie gesehen). Stattdessen fasst man fast alle x86-Prozessoren in einem Build zusammen
Wer redet denn von Prozessoren? Die Rede war von Plattformen, und da ist der Prozessor nur ein Teil. Du kannst in einem Windows und Linux System den gleichen Prozessor haben, trotzdem brauchst du zwei Kompilate. Selbst für ein und dieselbe Plattform habe ich schon unterschiedliche Kompilate gesehen, zB wenn eine Anwendung eine Basic Binary und eine Binary mit Support für diverse CPU Befehlssatzerweiterungen anbietet. Aber das ist schon wieder zu sehr OT. Fakt ist, ein C++ Compiler und die damit beiliegende Runtime kennen die Plattform. Wäre ja auch sonst zu blöd, wenn die CPU den Maschinencode gar nicht "verstehen" oder das BS die Executable gar nicht laden könnte.
Der Punkt war: Man fasst in der Regel zusammen, was man kann. Man compiliert nicht für Pentium I, II, III, IV, 4 D (mit x64) mal Windows 9x, NT, Linux, macht insgesamt 15 Compilate ohne AMD. Zeig mir eine ernstgemeinte Software, für die es so viele Compilate gibt.
macht der Intel Compiler automatisch und beim start wird das jeweilige codestück ausgewählt, dass am besten für eine cpu ist. mit einem hack (hat heise irgendwo auch genauer beschrieben), kann man patchen, dass auch das best passendste binary für AMD-cpus genommen wird. nebenbei gibt es diese "BigBinaries" schon länger, hatte z.b. apple bei umstellungen auf neue cpus benutzt und afaik gibt es bei WinCE auch diese vorgehensweise um möglichst viele cpus zu unterstützen. es gibt natürlich auch die möglichkeit binaries im voraus oder zur laufzeit auf neue cpus umzustellen (so wie es in etwa am anfang bei java war bzw mit JIT läuft), wurde/wird z.b. beim itanium gemacht um x86-code auszuführen.
Optimizer schrieb:
Optimizer schrieb:
Es gibt Variablen, die beim Programmstart nur einmal ausgelesen werden und sich amsonsten nicht mehr ändern. Ein C++ Compiler kann dies nicht nutzen.
Wieso nicht? Und selbst wenn, was wäre dabei der Nachteil?
Wieso nicht? Weil der Compiler vor dem Programmstart ins Spiel kommt. Ist doch ganz klar!
genau wie java, gibt es auch bei anderen sprachen die möglichkeit den ersten durchlauf mit profilling durchlaufen zu lassen, dann weiß der compiler das und kann im zweiten pass drüber gehen und diese problemstellen wegoptimieren.
Optimizer schrieb:
Optimizer schrieb:
Ein JIT-Compiler kann auch viel öfters feste Speicheradressen bilden, für die ein statische Compiler eine Indirektion einbauen muss. Das betrifft insbesondere die Fälle, wo man dynamisch was hinzulinkt.
Was verstehst du denn unter "festen Speicheradressen"?
Beispielsweise ich lade ne DLL hinzu, die kommt an irgendne Basisadresse im Textsegment. Jetzt rufe ich darin ne Funktion auf. Mein Programm wurde jetzt aber schon compiliert, also muss es die Adresse der Funktion ausrechnen, Basisadresse + Funktionsoffset. Bei JIT-linking wüsste ich nach der JIT-compilierung, wo die Funktion der DLL im Speicher steht und kann während der JIT-compilierung meines Codes direkt die Adresse eintragen.
afaik wird beim laden einer dll beim programmaufruf, jede auf die dll referenzierende stelle im programm mit der richtigen address der funktionen der dll überschrieben, so wie es der jit macht (find ich auch seltsam, aber hab ich auf irgend ner msdn seite gelesen, drum glaub ich das). man hat aber den vorteil, dass nicht in einer virtuellen umgebung diese arbeit durchgeführt wird, sondern im OS, was das mehrmalige laden von modulen erspart.
Optimizer schrieb:
Optimizer schrieb:
Ich schreibe immer "JIT-Compiler", der eigentliche Punkt ist aber auch, dass sämtliches Linking zur Laufzeit stattfindet. Das bringt erhebliche Vorteile beim hinzufügen von Laufzeit-Bibliotheken.
Da möchte ich dir ja auch gar nicht widersprechen, zumindest was Codeoptimierung betrifft. Aber wie sieht es zB mit Portabilität aus? C Bibliothen kann man zB auch problemlos mit diversen anderen Sprachen nutzen.
Ähm weiß nicht. Die Portabilität des Bytecodes ist jedenfalls nicht schlechter.
welche sprache außer java generiert denn noch bytecode für den JIT ?
Optimizer schrieb:
Optimizer schrieb:
Das Konzept der JIT-Compilierung ist insgesamt völlig überlegen.
Quellen?
Ich bin der Anfang (und das Ende). Ich habe es doch begründet. Wie gesagt, wir betrachten des ja von der theoretischen (der einzig sinnvollen) Seite. Der Wirtschaftler sagt natürlich "des Programm war jetzt in C++ geschrieben 5% schneller", ob einfach nur der Compiler besser war, findet er nicht so wichtig. Es gibt eine Menge weitere nicht-Performance Gründe, warum JIT-Compilierung auch einfach viel einfacher ist, im Zusammenhang mit Bibliotheken, die eben nicht nur aus C-Funktionen bestehen, sondern Klassen bereitstellen, von denen man ableiten können soll, usw... es geht alles irgendwie über 20 Indirektionen, aber JIT-Compilerung ist der bessere Weg, weil der Compiler dann sowohl das Hauptprogramm als auch die Lib vor sich liegen hat.
es ist aus meiner sicht der schlechtere weg. der c++ compiler hat alle sourcen meistens zur verfügung um daraus das beste binary zu generieren. DLLs und andere module sind meist komplett abgeschlossene bereiche mit schnittstellen, die nicht performancekritisch sind. alles was performancekritisch ist, ist meistens in einem binary für sich und es wurde aus dem source direkt ins binary optimiert. bei java wird meines wissens nach jede klasse zu einem bytecode-objekt und danach erst mit JIT zusammengefasst, an der stelle des byte-objekts ist bei c++ hingegen schon jede optimierung gelaufen und würde selbst mit einem JIT nichts mehr reissen können.
java wurde entwickelt um
1. bei niedrigem programmierniveau sicheren coden zu gewährleisten (kostenersparnis)
2. möglichst extrem flexibel zu sein durch eben modularisierung (kostenersparnis)
3. leicht portierbarkeit "Write once, run everywhere" (mehr potentiellen markt -> größere margen)java wurde nicht entwickelt um
1. schnell zu sein und ne performancekrone zu erhalten (im gegenteil, wurde anfangs nur mit interpretern ausgeliefert und mußte später JITs erhalten, damit es nicht 10x langsammer läuft als andere sprachen, nachdem MS für j++ soeinen erstellte)
2. um c++ zu ersetzen (im gegenteil, wichtier code soll weiterhin von hoghqualifizierten kräften in c/c++ erstellt werden z.b. SunOS)
3. allround eingesetzt zu werdendeswegen sollte man erst garnicht versuchen java als schneller darzustellen, ist wie ein vergleich eines ferraris mit einem trecker und der versuch mittels der ps-zahl die mögliche endgeschwindigkeit abzuschätzen.
mal ganz ehrlich. wenn man ein "perfektes" programm für sich haben möchte, stellt man nen hochqualifizierten coder ein und lässt es ihn in c++ machen und zahlt entsprechend (weil man etwas gutes haben möchte und für soviel geld dann auch verlangen darf dass es kein speicherfresser ist). wenn man ein "perfektes" programm für den markt haben möchte, weil es irgendjemand benutzen soll der dafür geld ausgibt, dann stellt man sich zwei studenten/praktikanten ein und lässt sie es in java/c# schreiben und spart geld und kann sich sicher sein, dass das programm, egal wie es laufen wird, wohl keine accessviolations werfen wird (weil man $$$ machen möchte)
greets
rapsotroll
-
Java ist für die die einfach schnell und einfach entwickeln wollen und denen die User egal sind.
Das zeigt doch die Diskussion Swing vs. SWT in diesem Thread. Ein Programmierer der solche Entscheidungen aus Sicht der Entwicklung und nicht aus Sicht des Anwenders trifft hat in meinen Augen sowieso den Beruf verfehlt. Für die ist Java genau richtig.
-
Ja, JAVA ist schneller...schneller im Resourcen verschlucken... *grins
-
frenki schrieb:
Java ist für die die einfach schnell und einfach entwickeln wollen und denen die User egal sind.
Das zeigt doch die Diskussion Swing vs. SWT in diesem Thread. Ein Programmierer der solche Entscheidungen aus Sicht der Entwicklung und nicht aus Sicht des Anwenders trifft hat in meinen Augen sowieso den Beruf verfehlt. Für die ist Java genau richtig.
Hallo,
Und aus diesem Grund werden wir auch weiterhin bei den ausgereiften
HighEnd-Produkten des bewährten Weltmarktführers bleiben, mit denen
wir in den vergangenen Jahren hervorragende Erfahrungen gemacht
haben.Die kosten zwar ein bisschen mehr, überzeugen aber durch einen
schnellen Return on Investment durch vorbildliche Sicherheit,
Stabilität, Kompatibilität, Performance, Usability, Skalierbarkeit,
und Kontinuität in der Produktpolitik.Und das ist es schliesslich, worauf es Experten wie meinen
hochqualifizierten Mitarbeitern und mir im harten Tagesgeschäft des
internationalen Wettbewerbs ankommt.Ideologisch motiviertes Bastelwerk, halbherzig zusammengeschustert
durch weltfremde Langzeitstudenten mit Taxischein, hat keinerlei
Chance, will man sich tagtäglich aufs Neue den Herausforderungen der
Globalisierung erfolgreich stellen. Da können einfach nur Lösungen
von Profis für Profis zum Einsatz kommen, die hervorragend durch das
Portfolio der Redmonder Software-Spezialisten abgedeckt werden.
-
Die Vervielfältigung der auf den Seiten www.c-plusplus.net, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.
-
C++_Programmierer schrieb:
frenki schrieb:
Java ist für die die einfach schnell und einfach entwickeln wollen und denen die User egal sind.
Das zeigt doch die Diskussion Swing vs. SWT in diesem Thread. Ein Programmierer der solche Entscheidungen aus Sicht der Entwicklung und nicht aus Sicht des Anwenders trifft hat in meinen Augen sowieso den Beruf verfehlt. Für die ist Java genau richtig.
Hallo,
Und aus diesem Grund werden wir auch weiterhin bei den ausgereiften
HighEnd-Produkten des bewährten Weltmarktführers bleiben, mit denen
wir in den vergangenen Jahren hervorragende Erfahrungen gemacht
haben.Die kosten zwar ein bisschen mehr, überzeugen aber durch einen
schnellen Return on Investment durch vorbildliche Sicherheit,
Stabilität, Kompatibilität, Performance, Usability, Skalierbarkeit,
und Kontinuität in der Produktpolitik.Und das ist es schliesslich, worauf es Experten wie meinen
hochqualifizierten Mitarbeitern und mir im harten Tagesgeschäft des
internationalen Wettbewerbs ankommt.Ideologisch motiviertes Bastelwerk, halbherzig zusammengeschustert
durch weltfremde Langzeitstudenten mit Taxischein, hat keinerlei
Chance, will man sich tagtäglich aufs Neue den Herausforderungen der
Globalisierung erfolgreich stellen. Da können einfach nur Lösungen
von Profis für Profis zum Einsatz kommen, die hervorragend durch das
Portfolio der Redmonder Software-Spezialisten abgedeckt werden.wo hast du denn diesen dünnschiss rauskopiert?
-
Artchi schrieb:
GPC schrieb:
Ich wünschte, es gäbe Swing für C++
Bin ja leider nie dazu gekommen gtkmm zu nutzen, aber wenn ich mir so die Doku dazu anschaue, würde ich pers. erstmal sagen: gtkmm ist für c++ das, was swing für Java ist. Bezogen auf das Design! Performance jetzt völlig außen vor.
Doch so ist es auch größtenteils. gtkmm hat imho das beste Design der C++ GUI-Libs, auch QT kann da nicht mithalten. Es ist inzwischen auch sehr flott geworden und schon an gtk+ dran. Auch (und speziell da) auf Windows hat es enorm an Geschwindigkeit hinzugewonnen, etwa seit der 2.6.x Version. Jawohl, gtkmm ist mein Favorit, wenn es um C++ mit GUI geht, da es zudem auch noch plattformunabhängig ist.
Ok, also was stört mich an gtkmm?
1. Die Windows-Portierung ist nach wie vor nicht von jedem zu machen, auch wenn es deutlich besser wird.
2. Das Listen-Widget ist einfach der Horror! Ich schreibe gerade an einem Tool, mit ca. 6 Listen, zwei mit mehreren Spalten und der Rest ist nur einspaltig. Mit Swing hätte ich die einspaltigen Listen kurz über das normale ListModel gelöst (welches hierfür schlicht ausreicht) und für die 2 komplexeren hätte ich halt kur ne eigene Klasse geschrieben. In gtkmm musste ich aber insgesamt drei Klassen schreiben, um nur die Darstellung zu haben. Wie ich die Daten dieses mal parallel zur Darstellung organisiere, weiß ich immer noch nicht. In Swing schmeiße ich die Daten einfach in das ListModel rein, übergebe es der JList und gut ist, es ist einfach besser organisiert.
Und irgendwie brauchte bisher jedes meiner gtkmm Programme irgendwo ne Liste und ich kann mir ums Verrecken nicht merken, wie ich damit umgehen muss, weil das Handling einfach Scheiße ist.Das war's eigentlich auch schon. Die Pluspunkte überzeugen:
+ Sauberes Design (OOP, namespaces...)
+ Plattformunabhängig
+ Gute Performance
+ Viele Möglichkeiten, da umfangreiche Widgets
+ Die sigc++ und glibmm als Unterbau
- Scheiß krüpplige Liste
- Auf Windows noch etwas schwierigAFAIK gibt's vom XFCE Projekt auch einen gtk+ Wrapper, der ähnlich wie gtkmm aufgebaut ist, aber der ist halt Linux-only.
Oder ist gtkmm doch nicht so schön?
Doch, ist es
frenki schrieb:
Java ist für die die einfach schnell und einfach entwickeln wollen und denen die User egal sind.
Autsch.
Das zeigt doch die Diskussion Swing vs. SWT in diesem Thread. Ein Programmierer der solche Entscheidungen aus Sicht der Entwicklung und nicht aus Sicht des Anwenders trifft hat in meinen Augen sowieso den Beruf verfehlt. Für die ist Java genau richtig.
Das ist jetzt irgendwie Blödsinn, denn ich will ja auch etwas Spaß am Programmieren haben und nicht den ganzen Tag fluchen, weil mein GUI-Toolkit Müll ist. Ich kenne keine Zahlen, aber schätzungsweise ist es den meistens Usern im Büroalltag wurscht, ob sie da SWT oder Swing vor sich haben (sofern sie überhaupt den Unterschied kennen und wissen, was das ist). Denen ist auch egal, dass ihre Anwendung momentan durch Swing noch etwas lahmer ist. Jedenfalls ist es mir als Büroanwender egal.
Vllt. freuen sie sich aber auch, dass ihre Programme in Swing sind, wenn es dann schneller als SWT ist und IBM den SWT Support einstellt?MfG
GPC
-
rapso schrieb:
welche sprache außer java generiert denn noch bytecode für den JIT ?
Was erwartest Du denn da? Keine? Da ist ne Liste mit über 200 entsprechenden Sprachen und Sprachvarianten: http://www.robert-tolksdorf.de/vmlanguages.html
rapso schrieb:
mal ganz ehrlich. wenn man ein "perfektes" programm für sich haben möchte, stellt man nen hochqualifizierten coder ein und lässt es ihn in c++ machen und zahlt entsprechend (weil man etwas gutes haben möchte und für soviel geld dann auch verlangen darf dass es kein speicherfresser ist). wenn man ein "perfektes" programm für den markt haben möchte, weil es irgendjemand benutzen soll der dafür geld ausgibt, dann stellt man sich zwei studenten/praktikanten ein und lässt sie es in java/c# schreiben und spart geld und kann sich sicher sein, dass das programm, egal wie es laufen wird, wohl keine accessviolations werfen wird (weil man $$$ machen möchte)
Naja, wer will schon ein "perfektes Programm" haben? ...und welches Programm ist schon perfekt, egal in welcher Sprache es geschrieben ist? In der Wirtschaft gibt es immer Grenzen bezüglich des Budgets, der Zeit usw.. Niemand ist da bereit, für etwas perfektes zu zahlen. Es ist nur eine Frage der Prioritäten. Und man sollte auch nicht vergessen: Wenn man für ein gegebenes Projekt eine feste Zeit zur Verfügung hat und dieses Projekt mit Java schneller entwickeln könnte, bleibt einem mit Java auch mehr Zeit zum Debuggen und zur Optimierung.
Abgesehen davon stellst Du es so dar, als ob man für Java nur unqualifiziertes Personal nehmen würde, für C++ aber die höchstausgebildeten Leute. Hier möchte ich doch nochmal auf die üblichen Jobstatistiken verweisen. Da stehen nämlich auch immer die durchschnittlich gezahlten Gehälter dabei. Und die sind in vergleichbaren Regionen. IMHO gibt es bei Java-Jobs sogar etwas mehr zu verdienen, als bei C++. In jedem Fall ist daraus nicht zu erkennen, dass Java vor allem in Verbindung mit Studentenjobs genutzt wird.
-
rapso schrieb:
nicht der JIT an sich, sondern das ganze system an sich sorgt für schlechte performance, weil das programm erstmal in bytecode und anschliessend in maschinencode (mittels JIT) umgewandelt wird. alle optimierungen die man vom eigentlichen source bis zum microcode sonst "weiß" werden durch erzeugung von temporärem bytecode nirgenswo hinterlegt und sind weg. möchte man durch ein array durchitterieren, ist der schnellste weg bei einer ARM-cpu der tödlichste für eine x86-cpu und umgekehrt sieht es änlich unoptimal aus. das ließt ein compiler natürlich aus dem source und generiert dann microcode der am besten für die cpu ist oder bytecode ins blaue hinaus (und der JIT kann danach nichts tolles mehr machen, weil ihm die informationen fehlen).
Und welche Informationen fehlen da deiner Meinung nach? Es wird ja oft genug kritisiert, dass man aus dem Bytecode wieder den Source herstellen kann. Ein JIT kann (und zwar bereits in der Praxis) Indexprüfungen eliminieren, wenn der Zugriff auf Arrayelemente vorhersehbar ist, er erkennt also beispielsweise for( int i; i < array.length; ++i ); Warum sollte er jetzt nicht für den Prozessor geeigneten Code generieren können?
Optimizer schrieb:
Optimizer schrieb:
Nein.
Nein? Aber sicher doch! Ein C++ Compiler _kennt_ die Plattform, für die er kompiliert.
Nein. Er kennt sie nicht gut genug.
er weiß besser wie er den source über die einzelnen stufen hinweg zu microcode umwandelt als es der javacompiler+JIT wissen können.
Dabei gehst du davon aus, dass wegen des Bytecodes Informationsverlust auftritt. Daran glaube ich noch nicht und es würde mich interessieren, auf welche Informationen du dich dabei beziehst. Amsonsten hat der JIT-Compiler eindeutig mehr Informationen/Quellen zur Verfügung, denn er hat den ganzen Source, der am Ende auf dem Computer vom Benutzer läuft, zur Verfügung und kann damit leichter modulübergreifend optimieren. Er kennt beispielsweise die Größe von fremden Objekten im Speicher und kann beim Zugriff auf Felder die Adresse ausrechnen. Nimm als Gegensatz mal COM, ein Objektmodell, dass es erlaubt, Klassenbibliotheken zur Laufzeit hinzuzulinken. Du kriegst in deiner Anwendung immer eine Indirektion (IDirect3DDevice9**) rein und ein einfacher getter kann auch nicht geinlined werden. Wenn du deine Klasse von einer COM-Klasse ableitest, besteht eine richtig physische Barriere zwischen den Membern der abgeleiteten Klassen und denen der Basisklasse.
Jetzt überleg mal, was ein JIT-Compiler im Vergleich dazu machen kann. Er erhält den Bytecode der Basisklasse und der abeleiteten Klassen.
Optimizer schrieb:
Optimizer schrieb:
Es gibt Variablen, die beim Programmstart nur einmal ausgelesen werden und sich amsonsten nicht mehr ändern. Ein C++ Compiler kann dies nicht nutzen.
Wieso nicht? Und selbst wenn, was wäre dabei der Nachteil?
Wieso nicht? Weil der Compiler vor dem Programmstart ins Spiel kommt. Ist doch ganz klar!
genau wie java, gibt es auch bei anderen sprachen die möglichkeit den ersten durchlauf mit profilling durchlaufen zu lassen, dann weiß der compiler das und kann im zweiten pass drüber gehen und diese problemstellen wegoptimieren.
Ich beziehe mich dabei auf Informationen, die nicht notwendigerweise bei jedem Programmstart gleich sind. Beispielsweise linke ich eine DLL hinzu, dort drin befindet sich die Konstante FOOBAR. Ich kann dir mit Sicherheit garantieren, dass jedes Vorkommen dieser Variable vom JIT mit dem Wert ersetzt wird. Bei einem fertig compiliertem Programm steht dagegen schon fest in deinem Code "rechne Basisadresse + offset" und lies den Wert der Variablen aus". Im Grunde ist es hier das selbe wie mit dem Inlinen von Methoden, die sich in DLLs befinden.
Optimizer schrieb:
Beispielsweise ich lade ne DLL hinzu, die kommt an irgendne Basisadresse im Textsegment. Jetzt rufe ich darin ne Funktion auf. Mein Programm wurde jetzt aber schon compiliert, also muss es die Adresse der Funktion ausrechnen, Basisadresse + Funktionsoffset. Bei JIT-linking wüsste ich nach der JIT-compilierung, wo die Funktion der DLL im Speicher steht und kann während der JIT-compilierung meines Codes direkt die Adresse eintragen.
afaik wird beim laden einer dll beim programmaufruf, jede auf die dll referenzierende stelle im programm mit der richtigen address der funktionen der dll überschrieben, so wie es der jit macht (find ich auch seltsam, aber hab ich auf irgend ner msdn seite gelesen, drum glaub ich das).
Ok, das überrascht nicht nur dich, aber unvorstellbar ist das nicht, gebe ich schon zu.
man hat aber den vorteil, dass nicht in einer virtuellen umgebung diese arbeit durchgeführt wird, sondern im OS, was das mehrmalige laden von modulen erspart.
Bei .Net gibt so genannte Application Domains. Vereinfach ausgedrückt erlauben die, ein anderes Programm im selben Betriebssystem-Prozess zu starten, mit der gleichen vollständigen Isolierung der Zustände, aber mit geteilten Resourcen, z.B. bereits JIT-compilierter Code und natürlich nur einmaliger VM-Overhead. Es gibt viele tolle Möglichkeiten, aber die Win32-Altlasten machen bei vielen Dingen noch einen Strich durch die Rechnung.
Es ist beispielsweise reichlich unnötig, einen VM-Prozess vom BS-Speicherschutz überwachen zu lassen, wenn man schon garantieren kann, dass keine access violations auftreten. Die Praxis sieht für solche Systeme halt noch eher schlecht aus.
Optimizer schrieb:
Optimizer schrieb:
Ich schreibe immer "JIT-Compiler", der eigentliche Punkt ist aber auch, dass sämtliches Linking zur Laufzeit stattfindet. Das bringt erhebliche Vorteile beim hinzufügen von Laufzeit-Bibliotheken.
Da möchte ich dir ja auch gar nicht widersprechen, zumindest was Codeoptimierung betrifft. Aber wie sieht es zB mit Portabilität aus? C Bibliothen kann man zB auch problemlos mit diversen anderen Sprachen nutzen.
Ähm weiß nicht. Die Portabilität des Bytecodes ist jedenfalls nicht schlechter.
welche sprache außer java generiert denn noch bytecode für den JIT ?
Wenn du Daten zwischen Modulen, die in verschiedenen Sprachen geschrieben worden sind, austauschen willst, brauchst du ein gemeinsames Datenmodell. C-DLLs kann jede Sprache benutzen, die sowas wie Pointer oder pass by ref kennt. COM-DLLs kann jede Sprache benutzen, die sowas wie Klassen und Objekte kennt. Es gibt keinen Grund, warum .Net-DLLs oder Java-Klassen nicht in anderen Sprachen benutzt werden können. Im Grunde ist Bytecode nichts anderes als auch ein Objektmodell, das aber keinen Unterschied zwischen deinem Programm und Bibliotheken macht, also ohne künstliche Grenze. Es gibt schon einige Compiler für andere Sprachen, die Java-Bytecode generieren, dazu hatte Gregor mal einen Link. Aber bei der Java VM war das Designziel nicht mehrsprachenfähigkeit. Bei .Net geht es aber eigentlich recht gut (ca. 50 Sprachen).
Natürlich geht nie in jeder Sprache alles, sonst wäre der Sinn von mehreren Sprachen irgendwie weg. Man hat immer nur eine gemeinsame Untermenge an Features zur Verfügung, nicht alle Features stehen jeder Sprache offen. Aber die tollen C-DLLs haben halt einfach keine Features, dann ist ja klar, dass die immer funktionieren.
es ist aus meiner sicht der schlechtere weg. der c++ compiler hat alle sourcen meistens zur verfügung um daraus das beste binary zu generieren. DLLs und andere module sind meist komplett abgeschlossene bereiche mit schnittstellen, die nicht performancekritisch sind.
Dem widerspreche ich. Ich möchte nicht darauf verzichten, von Bibliotheksklassen abzuleiten und Methoden zu ergänzen oder zu redefinieren. All das wäre reichlich inperformant, wenn die Klassen aus irgendwelchen DLLs kommen. Oder stell dir mal vor std::map<> käme aus einer DLL! "Nicht performancekritisch" ist ein statisches System nur, wenn du bereit bist, auf bestimmte Features zu verzichten.
Alles was performancekritisch ist, ist meistens in einem binary für sich und es wurde aus dem source direkt ins binary optimiert. bei java wird meines wissens nach jede klasse zu einem bytecode-objekt und danach erst mit JIT zusammengefasst, an der stelle des byte-objekts ist bei c++ hingegen schon jede optimierung gelaufen und würde selbst mit einem JIT nichts mehr reissen können.
Jede mögliche Optimierung ist gelaufen. Und was ist schlecht daran, wenn erst der JIT optimiert?
java wurde nicht entwickelt um
1. schnell zu sein und ne performancekrone zu erhalten (im gegenteil, wurde anfangs nur mit interpretern ausgeliefert und mußte später JITs erhalten, damit es nicht 10x langsammer läuft als andere sprachen, nachdem MS für j++ soeinen erstellte)Das ist auch genau der Grund, warum die Praxis für Java schlechter aussieht. Aber ich bin mal gespannt, wie .Net Programme in Zukunft laufen werden. Ich bin überzeugt, dass das Konzept eines Zwischencodes überlegen ist. Dabei muss man Sprachen und Reife der Compiler außer Acht lassen. Schon jetzt ist ein C++/CLI Programm mit JIT-Compilierung kaum langsamer als das gleiche C++ Programm.
-
Java überzeugt nicht.
Und aus diesem Grund werden wir auch weiterhin bei der ausgereiften HighLevel-Programmiersprache des bewährten Weltmarktführers bleiben, mit der wir in den vergangenen Jahren hervorragende Erfahrungen gemacht haben.
Die kostet nicht nur nichts, sondern überzeugt auch noch durch einen schnellen Return on Investment durch vorbildliche Sicherheit, Stabilität, Kompatibilität, Performance, Usability, Skalierbarkeit, Multiple Inheritance, echte Templates, Template Metaprogramming, Multi-Paradigms, funktionale Aspekte und Kontinuität in der Sprachpolitik.
Und das ist es schliesslich, worauf es Experten wie meinen hochqualifizierten Softwareentwicklern und mir im harten Tagesgeschäft des internationalen Wettbewerbs ankommt.
Ideologisch motiviertes Bastelwerk, halbherzig zusammengeschustert durch praxisfremde Marketingstrategen mit Zwangs-OOP-Fixierung, hat keinerlei Chance, will man sich tagtäglich aufs Neue den Herausforderungen der Globalisierung und der mit dieser einhergehenden ständig wechselnden Anforderungen an das Entwicklungswerkzeug erfolgreich stellen. Da können einfach nur Lösungen von Profis für Profis zum Einsatz kommen, die hervorragend durch das Stroustrupsche Meisterwerk abgedeckt werden.
-
frenki schrieb:
Java ist für die die einfach schnell und einfach entwickeln wollen und denen die User egal sind.
Das zeigt doch die Diskussion Swing vs. SWT in diesem Thread. Ein Programmierer der solche Entscheidungen aus Sicht der Entwicklung und nicht aus Sicht des Anwenders trifft hat in meinen Augen sowieso den Beruf verfehlt. Für die ist Java genau richtig.
Meine These: Wenn man sich für eine genutzte Bibliothek als Programmierer verstellen muss, weil sie komplett anders als der Rest des Programms funktioniert, werden hiermit auch Bugs verbunden sein, die im Programm entstehen. Aus meiner Sicht ist das also eine Bug-Quelle. Zudem wird das Programm an dieser Stelle schlechter wartbar sein und und und.
Mit andere Worten: Es gibt auch aus Sicht des Nutzers des Programms Gründe, die gegen SWT sprechen. Wenn eine genutzte Bibliothek nicht gut in das Programmiermodell passt, dann wird die Qualität der Software dadurch leiden.
...nur so ne Meinung.
-
rapso schrieb:
java wurde nicht entwickelt um
[...]
3. allround eingesetzt zu werdenHä? Was glaubst Du, warum Diskussionen wie diese überhaupt entstehen? Weil sich die Anwendungsgebiete von Java und C++ nicht überschneiden? Wahrscheinlich nicht. Die Anwendungsgebiete überschneiden sich in weiten Teilen. Und Java wird in sehr sehr vielen Bereichen eingesetzt (wenn man mal von Treibern absieht). Die Entwicklung von Desktopanwendungen gehört in jedem Fall auch zu den Anwendungsgebieten von Java. Und das ist auch ein Bereich, in dem die Java-Nutzung zunehmen wird.
-
Es muss endlich mal eine vernünftige Alternative zu Swing entwickelt werden. Swing ist rufschädigend für Java.
-
hab nur ich das gefühl, oder sind die meisten hier c++ programmierer, die keine arbeit finden, weil auf dem markt nunmal mehr java als c++ programmierer gesucht werden, und deshalb nichts besseres zu tun haben als ihren frust hier rauszulassen indem sie ihr halbes "expertenwissen" propagieren zu versuchen?
-
gurkenesser schrieb:
hab nur ich das gefühl, oder sind die meisten hier c++ programmierer, die keine arbeit finden, weil auf dem markt nunmal mehr java als c++ programmierer gesucht werden, und deshalb nichts besseres zu tun haben als ihren frust hier rauszulassen indem sie ihr halbes "expertenwissen" propagieren zu versuchen?
Bloß kein Neid.
f'`8k
Bye, TGGC
-
gurkenesser schrieb:
hab nur ich das gefühl, oder sind die meisten hier c++ programmierer, die keine arbeit finden, weil auf dem markt nunmal mehr java als c++ programmierer gesucht werden, und deshalb nichts besseres zu tun haben als ihren frust hier rauszulassen indem sie ihr halbes "expertenwissen" propagieren zu versuchen?
hehe, kommt mir auch so vor :0)