Donnerstag, 14. April 2016

JavaFX Performance #1 - Swing und JavaFX

[Hinweis: Die folgenden Ergebnisse stammen aus meiner veröffentlichten Masterarbeit "JavaFX - Strategische / Technologische Bewertung"]

Im Rahmen meiner Masterarbeit welche JavaFX behandelt, habe ich die Performance von JavaFX und Swing sowie von JavaFX 2, JavaFX 8 und JavaFX 9 (Early Access Build 110) betrachtet. Jedoch bin ich der Meinung, dass meine Erkenntnisse vielleicht auch anderen weiterhelfen können und möchte diese daher hier in meinem Blog teilen. Wie im Titel bereits zu sehen, ist dies der 1.Part, welcher sich mit der Performance zwischen JavaFX 2 und Swing beschäftigen wird. Der 2.Part wird sich dann mit der Performance zwischen den verschiedenen JavaFX Versionen befassen und der 3.Part mit einem selbst entwickelten Benchmark. Ich hoffe es wird euch gefallen!



Einführung

Wenn man die Performance von JavaFX herausfinden möchte und dafür beispielsweise Google zu Hilfe nimmt, kommt man früher oder später auf den sogenannten Bubblemark Benchmark von Alexey Gavrilov. Dieser, leider stark veraltete, Benchmark ermöglicht einen Vergleich zwischen verschiedenen RIA Frameworks. Da dieser aber wie erwähnt sehr veraltet ist (behandelt nur JavaFX 1.x), verwende ich stattdessen die für die aktuelle Version von JavaFX angepasste Version vom User TBEERNOT.

Vorgehensweise Bubblemark

Die Vorgehensweise des Bubblemark Benchmarks ist relativ simple: Innerhalb einer festgelegten Region, welche wiederum innerhalb eines Fensters ist, werden Bitmapbälle bewegt. Diese wiederum können von den "Wänden" der Region abprallen, aber nicht von anderen Bällen, da dies ein Fall für den Kollisions-Algorithmus wäre und daher nichts mit der grafischen Leistung zu tun hat. Nach festgelegten Intervallen wird die Anzahl der Bälle erhöht und jeweils nach 5 Sekunden die aktuellen Frames-per-Second (FPS) aufgezeichnet. Umso höher dieser Wert ist umso besser ist auch die Performance. Wichtig ist hierbei, dass bei JavaFX das JVM Argument -Djavafx.animation.fullspeed=true mitgegeben werden muss, da JavaFX standardmäßig V-Sync aktiviert hat und dies bei aktuellen Monitoren die FPS bei 60 begrenzt. Nachdem die FPS aufgezeichnet sind wird die Anzahl der Bälle erneut erhöht und das ganze wiederholt sich bis eine festgelegte Maximal Anzahl von Bällen erreicht ist und der Benchmark abbricht bzw. beendet ist.

Ergebnisse

An dieser Stelle werde ich nun die Ergebnisse von TBEERNOT zeigen, da diese schon aussagekräftig genug sind.

https://tbeernot.files.wordpress.com/2011/11/moveonly.png

Die X-Achse bezeichnet die Anzahl der Bälle in 100er und die Y-Achse die entsprechenden FPS. "JavaFX bitmap +" bedeutet einfach nur, dass hierbei, wie oben beschrieben, V-Sync deaktiviert wurde. 

Bei den Ergebnissen fällt zu Beginn die Begrenzung auf 200 FPS bei Swing auf. Dies wird einfach dadurch begründet, dass die Swing Variante einen 5 ms Timer verwendet um die FPS zu berechnen. Dennoch kann man vermuten, dass Swing auch dort knapp unter JavaFX liegen würde. Interessanterweise ist kein "so" größer Unterschied zu erkennen. Dies liegt daran, dass, auch wenn man es vielleicht nicht direkt glauben würde, Swing bereits Hardware-Beschleunigung verwendet und nicht nur JavaFX (https://tbeernot.wordpress.com/2011/11/15/javafx-2-0-bubblemark-part-2/). Allerdings sieht man schon dass JavaFX 2 bereits eine bessere Performance liefert als Swing. Daher können wir definitiv sagen, dass von Seiten der grafischen Performance JavaFX Swing abgelöst hat.

Fortsetzung

Nachdem wir nun wissen, dass Swing weniger FPS erzeugt als JavaFX 2, stellt sich nun die Frage wie es aber zwischen JavaFX 2 und dem aktuellen JavaFX 8 aussieht. Dazu aber mehr im 2.Part ...

Keine Kommentare:

Kommentar veröffentlichen