Java - unglaubliche Performance?

C

Crymes

Guest
Hallo,
Ich habe die letzte Zeit meine Ballsimulation auf Java portiert und jetzt schaut euch mal die Ergebnisse an: (Als erstes Java danach C++)
1000 Bälle: 15,19 500: 55,58 250: 280,132 100: 1800,185
Könnt ihr euch das erklären?
Warum geht Java im unteren Bereich so ab?
Ist Freeglut so langsam?

Ich hab mal die 2 Programme (eigentlich nur 1 :) ) im Anhang, da könnt ihr es wenn ihr wollt noch mal testen.
Ball mit b hinzufügen, mit l löschen. Di großen Bälle dann bitte mit rechter Maustaste entfernen.

Bin gespannt auf eure Ergebnisse :daumen:
 

Anhänge

  • Ball Simulation.zip
    192,2 KB · Aufrufe: 42
1200 Bälle:
Java: 215 FPS
C++: >60 FPS (seh nur 60 wegen VSynch ;) )

Allerdings wirkte das bewegte Bild bei C++ viel (!!!!!) flüssiger/"geschmeidiger". Das kann allerdings die verschiedensten Ursachen haben.
Warum das bei dir jetzt so einen großen Unterschied hat kann ich dir so nicht sagen. Wird aber bestimmt an der Art liegen, wie Java bzw. Freeglut zeichnen (ggf. nutzt Java nur Rectangle-Invalidation bei den einzelnen Zeichenobjekten...) oder aber es könnte auch eine Treiber-/Taktsache sein. Taktet sich deine GPU bei Cpp und Java gleichermaßen hoch?

Der Titel ist außerdem nicht soooo ganz passend, eigentlich vergleichst du ja Freeglut und Java2D (?). Für der Vergleich Cpp vs Java müsstest du mal nur die Logik betrachten. Sprich z.B. die Zeit messen, die jeweils für eine Iteration durch [k] Bälle gebraucht wird. Und selbst das ist dann noch nicht pauschal zu verallgemeinern ^^

Edit: Kleine Randbemerkung für Java: Bei mir starten die FPS mit 0 Bällen bei 187326798E7, das ist ja auch mal nett :D
 
is halt die frage (was fadade glaube schon andeutete), ob ogl beim c prog auch die cpu nutzt. wenns ogl1 is, dann musst du dafür diplaylisten nutzen oder generell solche buffer-object geschichten. vllt nutzt j2d das von haus aus? kA ^^
 
Ich nutze bei C++ OpenGL 1 und für jeden Ball passe ich eine Ball-Displayliste mit Radius 1 an.
Bei Java nutze ich für jeden Ball fillOval .
Vielleichtliegt es auch an der Schrift, da wird bei Glut jeder Buchstabe einzeln in einer Schleife gezeichnet.

Was mich aber mehr beeindruckt ist der Unterschied wenn keine Bälle da sind, da werden einfach nur win paar if Abfragen verarbeitet und weiter nichts.
Dss ist bei meinem netbook dann ein Unterschied von ein paar 10000 zu 300 Fps.
 
Durch die HotSpot Technik kann Java Code zur Laufzeit adaptiv optimiert werden. Einige Dinge funktionieren auch einfach schneller in Java, da gibt es auch Benchmarks im Netz zu.
 
Genau 1000 Bälle (FPS mit Afterburner ausgelesen)

C++: 92 FPS
Java: Will sich nicht öffnen lassen. ;)


Edit: Habe es recompiled, die Java FPS Anzeige sagt mir zwischen 135 und 145 FPS. Allerdings, scheint das nicht mit OpenGL / D3D oder ähnlichem von Java gezeichnet zu werden, da Afterburner keine FPS Anzeige anzeigt.
Werde mir bissl deinen Code anschauen (dein Coding Style geht ma gar nicht :ugly:).
 
Zuletzt bearbeitet:
Ich tue hier mal unter meinem Beitrag noch die Source-Dateien von Java und C++ anhängen, dann brauchst du´s nicht zu dekompilieren :)
Übrigens: Die C++-Version war zuerst da ;)
 

Anhänge

  • Source-Code.zip
    498,5 KB · Aufrufe: 36
Java Source Decompilen ist ein Befehl. Das war nicht das Problem, C++ ist etwas komplizierter. Aber danke schön, ich werde mal reinschauen. ;)
 
Zurück