Java vs. C. Performance-Vergleich
-
314159265358979 schrieb:
zugegebenermaßen habe ich keine Ahnung, wie sich das auf das Programm auswirkt, oder warum das Ergebnis falsch ist.
(105)2, was im Konstruktor von Pi berechnet wird, ist größer als 2^31.
-
Michael E. schrieb:
314159265358979 schrieb:
zugegebenermaßen habe ich keine Ahnung, wie sich das auf das Programm auswirkt, oder warum das Ergebnis falsch ist.
(105)2, was im Konstruktor von Pi berechnet wird, ist größer als 2^31.
Das muss jetzt aber für PI ziemlich erniedrigend sein. Schließlich hat er dich als dumm bezeichnet.
-
Steffo schrieb:
Schließlich hat er dich als dumm bezeichnet.
Habe ich nicht. Und wieder eine absichtliche Umformulierung. Und dann sagt mir volkard, ich soll nicht so aggressiv sein.
-
314159265358979 schrieb:
Steffo schrieb:
Schließlich hat er dich als dumm bezeichnet.
Habe ich nicht. Und wieder eine absichtliche Umformulierung. Und dann sagt mir volkard, ich soll nicht so aggressiv sein.
OK, ich korrigiere mich, du hast ihn nur als "unglaublich blöd" und "ignoranten Trottel" bezeichnet.
314159265358979 schrieb:
Falsch, ich vergleiche noch gar nichts. Und wenn du nicht so unglaublich blöd wärst, hättest du dir denken können, dass das Resultat mit Java gleich kommt. Aber hauptsache gleich mal auf PI drauf, dabei hast du ja nichts zu befürchten, richtig?
314159265358979 schrieb:
Michael E. schrieb:
314159265358979 schrieb:
@Steffo: Nö, eine Minute schneller.
ROFL
Weswegen hast du mich noch gleich beleidigt?
Genau das meine ich. Ignoranter Trottel.
Ich wollte dir nur zeigen wie unglaublich schnell solche Beleidigungen nach hinten gehen können und dass du das nächste mal besser überlegst bevor du irgendetwas auf die Tasten haust. - Das nur mal so als Tipp.
L. G.
Steffo
-
314159265358979 schrieb:
@volkard: Wodurch habe ich dich enttäuscht?
Du reißt die Klappe zu weit auf. Das wäre ja nicht schlimm, wenn Du so oft auch recht hättest. Aber das ist nicht der Fall. Du hast nur die Sprache an sich im Kopf. Ich habe noch keinen gesehen, der sie so schnell lernt, wie Du (Lob!). Aber das ist nur die Sprache. Du hast Null Erfahrung. Wenn Du jemanden wie Michael E., Gregor, Jester, Bashar oder so anpflaumst, weil Du annimmst, daß man etwas eher so machen sollte, aber sie mit 10+ Jahren Erfahrung inzwischen wissen, daß man es doch anders machen sollte, und Du dann die untere Schublade aufmachst, das ist nicht gut. Es ist auch nicht gut, wenn ein Nube im Forum was fragt und Du ihm Deine Weisheiten kundtust, wie er seine Architektur überarbeiten sollte. Du weißt einfach noch nicht, wie man Programme baut, die man längere Zeit warten kann oder die man verkaufen kann. Kannste auch nicht. Es gibt keinen Königsweg zur Programmierung. Man muß es wohl tun und aus Fehlern lernen. Vermutlich. Vielleicht findet mal jemand einen Königsweg zur Programmierung und nebenbei einen Königsweg zur Mathematik. Aber seit 2000 Jahren sind wir am Suchen und haben noch keinen gefunden. Es gibt gute Bücher wie von Meyers und schlechte Bücher wie von Wolf. Wolf denkt vermutlich, er habe die Weisheit mit Löffeln gefressen. Er hat keine Kontrollinstanz, der er glauben würde. Uih, das könnte uns allen passieren. Mach Dir mal Gedanken. Wieviele Projekte sind Dir schon umgekippt? Was haste draus gelernt? Noch nichts. Ätsch.
Mach weiter so mit dem schnellen Lernen! Du kannst in 5 Jahren schaffen, wofür ich 10 Jahre brauchte. Oh, ich war auch ein vorlauter Hansel und wurde von eldermen gelegentlich zurückgepfiffen. Aber ich hatte nie mir den Ruf erarbeitet, ein Troll zu sein. So weit bist Du aber schon. Das ist nicht gut. Du mußt doch auch selber bemerken, wie die Reaktionen auf Dich sind. Da stimmt doch was nicht.
-
Michael E. schrieb:
314159265358979 schrieb:
zugegebenermaßen habe ich keine Ahnung, wie sich das auf das Programm auswirkt, oder warum das Ergebnis falsch ist.
(105)2, was im Konstruktor von Pi berechnet wird, ist größer als 2^31.
Die Anzahl der Treffer läuft sogar schon früher über. Denn man hat pi*r^2 Treffer. Damit das kleiner als 2^31 ist, muss r <= 26145 sein.
-
volkard schrieb:
Ich habe noch keinen gesehen, der sie so schnell lernt, wie Du (Lob!).
Mir kommt es eher so vor, als ob mein Lernfortschritt momentan stillsteht. Habe nicht das Gefühl, dass ich besonders dazulerne.
volkard schrieb:
Es ist auch nicht gut, wenn ein Nube im Forum was fragt und Du ihm Deine Weisheiten kundtust, wie er seine Architektur überarbeiten sollte.
In letzter Zeit habe ich mich bemüht, gerade darauf zu achten. Kannst du mir Beispiele zeigen, wo ich so reagiert habe?
volkard schrieb:
Aber ich hatte nie mir den Ruf erarbeitet, ein Troll zu sein. So weit bist Du aber schon. Das ist nicht gut. Du mußt doch auch selber bemerken, wie die Reaktionen auf Dich sind. Da stimmt doch was nicht.
Natürlich stimmt da was nicht. Aber kannst du mir sagen, wie ich da wieder raus kommen soll? Ich sehe eigentlich keinen Weg. So viel Mühe ich mir auch gebe (und das habe ich schon mehrmals versucht), die Leute suchen trotzdem nach dem kleinsten Fehler. Und wenn kein Fehler gefunden wird, wird nach dem am einfachst missinterpretierbaren gesucht. Was soll ich denn da tun? Ich würde gerne meinen Ruf verbessern, aber die Leute müssen das auch zulassen.
-
314159265358979 schrieb:
Natürlich stimmt da was nicht. Aber kannst du mir sagen, wie ich da wieder raus kommen soll? Ich sehe eigentlich keinen Weg. So viel Mühe ich mir auch gebe (und das habe ich schon mehrmals versucht), die Leute suchen trotzdem nach dem kleinsten Fehler. Und wenn kein Fehler gefunden wird, wird nach dem am einfachst missinterpretierbaren gesucht. Was soll ich denn da tun? Ich würde gerne meinen Ruf verbessern, aber die Leute müssen das auch zulassen.
Ich bin hier im Forum absolut neu und ich habe dich heute als Troll kennengelernt. Da gab es nichts zu suchen, um dich in eine Schublade zu stecken. Deine Beiträge lesen sich hinterher so als ob dir gar nicht bewusst sei, was du da eigentlich schreibst. Ich schlage dir vor, du liest den Thread ab Seite 10 nochmals durch...
L. G.
Steffo
-
Steffo schrieb:
Ich bin hier im Forum absolut neu und ich habe dich heute als Troll kennengelernt. Da gab es nichts zu suchen, um dich in eine Schublade zu stecken. Deine Beiträge lesen sich hinterher so als ob dir gar nicht bewusst sei, was du da eigentlich schreibst. Ich schlage dir vor, du liest den Thread ab Seite 10 nochmals durch...
L. G.
SteffoWas du heute kennengelernt hast, war der besonders schlecht gelaunte, vom RL geplagte PI. Mein Verhalten heute war scheiße, das sehe ich auch ein. Aber das ist nicht immer so.
-
314159265358979 schrieb:
Was du heute kennengelernt hast, war der besonders schlecht gelaunte, vom RL geplagte PI. Mein Verhalten heute war scheiße, das sehe ich auch ein. Aber das ist nicht immer so.
Tja, ich habe kein Problem den Resetknopf zwischen uns beiden zu drücken, ich denke, bei dem Rest hier sieht das nicht anders aus. Wenn du lernst Schwächen anderer zu akzeptieren, wirst du auch deine Schwächen akzeptieren und dann wirst du auch angemessener anderen Leuten gegenüber antworten können.
L. G.
Steffo
-
...PI hats gelesen. Posting gelöscht...
-
Nochmal ein kurzer Einwurf zum Thema:
Im folgenden sind alle int durch int64_t bzw. long ersetzt, um Überläufe zu vermeiden.
r=100000 - gcc 4.6, x86-64, march=native -O3:
`real 0m48.759suser 0m48.750s
sys 0m0.000s`
r=100000 - openJDK 6b22:
`real 1m59.765suser 1m59.750s
sys 0m0.050s`
Und jetzt noch einmal C++ ohne -march=native (amdfam10):
`real 1m6.583suser 1m6.490s
sys 0m0.010s`
-march=native bringt bei mir also durchaus eine ganze Menge, fast 30%.
Dabei ist der einzig relevante Unterschied zwischen den beiden Erzeugnissen, dass mit march=native an zwei Stellenincq
stattaddq $1
verwendet wird.
-
Der Fairness halber: Könntest du evtl. mal das neueste JDK7 runterladen und dann nochmals testen?
Fedora bietet bei mir das neueste JDK noch nicht an.
-
Mit dem openJDK 7 komme ich auf folgende Werte:
`real 1m54.053suser 1m54.060s
sys 0m0.050s`
Also knapp 5% besser.
Edit: wo wir gerade dabei sind:
r=10000(!) gcj-4.6 -O3 march=native
`real 0m36.228suser 0m36.100s
sys 0m0.090s`
Das mit r=100000 läuft immer noch und wenn ich mal hochrechnen darf, wird's wahrscheinlich eine Stunde dauern.
Hätte es gerne auch mit LTO ausprobiert um Inlining zu ermöglichen, aber den Versuch quittiert mir sowohl gcj-4.5 wie auch 4.6 mit unterschiedlichen ICEs.Jedenfalls hat da die JRE doch deutlich die Nase vorn.
-
Hätte ehrlich gesagt nicht gedacht, dass C++ Java immernoch so sehr überlegen ist. Oo Bin da ehrlich gesagt etwas enttäuscht!
-
Gregor schrieb:
Java wird da aus folgendem Grund ein Problem bekommen: Es gibt in Java einen Overhead für jedes Objekt, der 8 Byte groß ist. Zudem steckst Du nicht die Objekte in das Array, sondern nur Zeiger auf diese Objekte. Auch nochmal 8 Byte. Deshalb sind Java-Objekte einfach viel größer als C++ Objekte. Du sprengst den Cache damit früher, brauchst mehr Speicher und so weiter.
Nochmal zum Verständnis: Willst du damit sagen, dass in Java Objekte in Arrays so etwas wie verkettete Listen sind?!
-
Steffo schrieb:
Gregor schrieb:
Java wird da aus folgendem Grund ein Problem bekommen: Es gibt in Java einen Overhead für jedes Objekt, der 8 Byte groß ist. Zudem steckst Du nicht die Objekte in das Array, sondern nur Zeiger auf diese Objekte. Auch nochmal 8 Byte. Deshalb sind Java-Objekte einfach viel größer als C++ Objekte. Du sprengst den Cache damit früher, brauchst mehr Speicher und so weiter.
Nochmal zum Verständnis: Willst du damit sagen, dass in Java Objekte in Arrays so etwas wie verkettete Listen sind?!
Nein. ...vielleicht erläutere ich das morgen nochmal genauer.
-
Ändern sich die Java Zeiten wenn die Applikation mehrmals nacheinander gestartet wird?
-
Gregor schrieb:
Steffo schrieb:
Gregor schrieb:
Java wird da aus folgendem Grund ein Problem bekommen: Es gibt in Java einen Overhead für jedes Objekt, der 8 Byte groß ist. Zudem steckst Du nicht die Objekte in das Array, sondern nur Zeiger auf diese Objekte. Auch nochmal 8 Byte. Deshalb sind Java-Objekte einfach viel größer als C++ Objekte. Du sprengst den Cache damit früher, brauchst mehr Speicher und so weiter.
Nochmal zum Verständnis: Willst du damit sagen, dass in Java Objekte in Arrays so etwas wie verkettete Listen sind?!
Nein. ...vielleicht erläutere ich das morgen nochmal genauer.
Ok, wenn Du in Java ein Array von Point Objekten mit jeweils 2 int Variablen (2 * 4 Byte) hast, dann sieht das IMMER so aus:
--------- --------- --------- |Point 1| |Point 2| |Point 3| | 8+4+4 | | 8+4+4 | | 8+4+4 | (3 Point | Byte | | Byte | | Byte | Objekte) --------- --------- --------- ^ ^ ^ | | | (3 Zeiger) ------|-----------|-----------|------ | | | | | | | | | | | | | | (Array mit | X | X | X | 3 Elementen) | 8 Byte | 8 Byte | 8 Byte | | | | | -------------------------------------
In jedem Array-Platz ist nur ein Zeiger auf das jeweilige Objekt gespeichert. Ich gehe von einer 64-Bit JVM aus, da sind diese Zeiger dann natürlich 8 Byte groß. Zudem hat jedes Objekt einen Overhead von 8 Byte, in dem praktisch abgespeichert ist, zu welcher Klasse dieses Objekt gehört. Das macht insgesamt 8+8+4+4=24 Byte Speicherbedarf pro gespeichertem Point Objekt.
In C++ kannst Du hingegen auch so etwas haben:
------------------------------------- | --------- | --------- | --------- | | |Point 1| | |Point 2| | |Point 3| | | | 4+4 | | | 4+4 | | | 4+4 | | | | Byte | | | Byte | | | Byte | | | --------- | --------- | --------- | -------------------------------------
Hier kannst Du die Objekte also direkt ins Array stecken und hast nicht notwendigerweise eine Indirektion durch irgendwelche Zeiger, die viel Platz benötigen. Zudem hast Du hier keinen Overhead, in dem der Typ des Objekts steht. Zusammengefasst hast Du hier also nur 4+4=8Byte Speicherbedarf pro gespeichertem Point Objekt.
Natürlich macht sich das vor allem bei Massen an sehr kleinen Objekten bemerkbar. Aber dann kann es eben durchaus sein, dass ein Javaprogramm ein Vielfaches des Speichers benötigt, den ein entsprechendes C++Programm benötigt.
War das verständlich?
-
Die Erklärung ist verständlich, danke Gregor. Aber weshalb werden in Java auf diese Weise Objekte mit so viel Overhead implementiert? Hat das unter anderem etwas mit Reflections zu tun?
L. G.
Steffo