Samstag, 30. April 2016

JavaFX Performance #3 - BenchmarkJFX

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

Hallo und willkommen zurück zum 3. und vorerst letzten Part des JavaFX Performance Beitrags!

Einleitung

Im letzten Part haben wir anhand des Bubblemark Benchmarks JavaFX 2 und JavaFX 8 miteinander verglichen und gesehen, dass JavaFX 8 ca. 17% schneller war als JavaFX 2. Jedoch war ich nicht ganz zufrieden mit dem Ergebnis, da ich der Meinung bin, dass Bitmaps bewegen nicht wirklich Praxis-relevant ist. Ausgenommen natürlich man möchte ein JavaFX Spiel entwickeln ;). Daher habe ich mich kurzerhand dazu entschlossen einen eigenen Benchmark, welcher auf dem Bubblemark Benchmark aufbaut, zu entwickeln. Das Ergebnis ist der BenchmarkJFX!


BenchmarkJFX

Der BenchmarkJFX ist in der Lage verschiedene Benchmarks nacheinander auszuführen. Dazu wird jeder Benchmark in eine eigene Klasse ausgelagert und die STAGE-Klasse extended. Dadurch sind wir in der Lage in der Main-Klasse die showAndWait()-Methode bei den Benchmarks aufzurufen. Diese Methode erspart es uns, Mechanismen einzubauen, welche auf das Ende der Benchmarks warten. Die Methode showAndWait() erledigt dies nämlich von selbst. Sie zeigt eine Stage, wie in unserem Fall einen Benchmark an, und wartet anschließend mit der weiteren Codeausführung bis der Benchmark komplett durchgelaufen ist und sich schließt. Dazu muss der Benchmark selber, die showAndWait()-Methode überschreiben und am Ende die close()-Methode ausführen (hide() geht auch!). Der eigentliche Benchmark wird dabei in der überschriebenen showAndWait()-Methode durchgeführt. Das war es im Grunde auch schon!

Die Benchmarks

Im folgenden werde ich einmal kurz die zur Zeit verfügbaren Benchmarks vorstellen, sowie die Ergebnisse die diese lieferten:

BitmapBalls und Vectorballs
Ich glaube diese beiden muss ich nicht wirklich noch einmal beschreiben, da diese im Grunde die beiden Bubblemark Benchmarks sind, welche ich nur um weitere Anpassungen erweitert habe. So kann man nun einfach die Startanzahl, Endanzahl und Inkremente der Bälle und die WarmUp-Anzahl angeben. Des weiteren habe ich die Region in welche die Bälle sich bewegen auf Bildschirmgröße angehoben. Ansonsten sind beide Benchmarks wie beim Bubblemark Benchmark. Im folgenden sind die Ergebnisse mit den Parametern (Startanzahl=500, Endanzahl=9000, Inkrement=500, WarmUp=10, Durchläufe=10) zu sehen:

  • Bitmapballs (Durchschnitt)
    • JavaFX 2: 226,5 FPS
    • JavaFX 8: 228,9 FPS
    • JavaFX 9 (ea110): 228,4 FPS
  • Bitmapballs (Durchschnitt & Fullscreen)
    • JavaFX 2: 133,4 FPS
    • JavaFX 8: 133,3 FPS
    • JavaFX 9 (ea110): 133,6 FPS
  • Vectorballs (Durchschnitt)
    • JavaFX 2: 109,7 FPS
    • JavaFX 8: 153,8 FPS
    • JavaFX 9 (ea110): 151,2 FPS
  • Vectorballs (Durchschnitt & Fullscreen)
    • JavaFX 2: 86 FPS
    • JavaFX 8: 102,9 FPS
    • JavaFX 9 (ea110): 105,3 FPS
Da das Bitmap Ergebnis kaum Unterschiede aufweist, habe ich diesmal nur die VectorBall Ergebnisse in Relation zueinander gestellt. Das Ergebnis ist: JavaFX 8 (und auch JavaFX 9) ist ungefähr 24% schneller als JavaFX 2.

ListView Benchmark
Im ListView Benchmark wird, wie der Name schon vermuten lässt, die JavaFX ListView bewertet. Dazu wird zunächst eine leere ListView erstellt welche anschließend pro Frame mit einer neuen Reihe gefüllt wird und dies für eine definierte Zeit. Bei ersten Versuchen zeigte sich, dass wenn die Änderungen an der Liste nicht mehr zu sehen sind, weil z.B. die neuen Reihen am Ende der Liste hinzugefügt wurden und das Ende nicht auf dem Bildschirm zu sehen ist, die FPS sich kaum noch verändern. Daher werden aktuell die neuen Reihen immer an die erste Stelle in der Liste hinzugefügt und so die ListView dazu gezwungen jede Reihe neu zu rendern. Nachdem die definierte Zeit abgelaufen ist, wird eine weitere ListView hinzugefügt und das ganze beginnt von Vorne. Im folgenden sind die Ergebnisse mit den Parametern (Endanzahl=10, Durchläufe=20, WarmUp=3) zu sehen:

  • ListView (Durchschnitt)
    • JavaFX 2: 59,4 FPS
    • JavaFX 8: 292,6 FPS
    • JavaFX 9 (ea110): 282,6 FPS
  • ListView (Durchschnitt & Fullscreen)
    • JavaFX 2: 31,6 FPS
    • JavaFX 8: 112,1 FPS
    • JavaFX 9 (ea110): 109 FPS

Das Ergebnis ist: JavaFX 8 ist unfassbare 78% und JavaFX 9 ist 77% schneller als JavaFX 2! 

AreaChart Benchmark
Im AreaChart Benchmark wird bewertet, wie gut sich die verschiedenen JavaFX Versionen bei AreaChart Diagrammen unterscheiden. Dazu wird ein leeres AreaChart Diagramm mit einer definierten Anzahl an X und Y Grenzen erstellt. Anschließend wird eine neue Serie hinzugefügt und mit zufälligen Werten gefüllt, welche jedoch im Rahmen der Grenzen sind. Dann werden für eine definierte Zeit, jede Sekunde die kompletten Werte der Serie mit neuen zufälligen Werten gefüllt. Die Animationen bei Werteänderungen sind dabei im AreaChart Diagramm aktiviert. Nach der abgelaufenen Zeit wird eine weitere Serie hinzugefügt und es beginnt von Vorne. Im folgenden sind die Ergebnisse mit den Parametern (Endanzahl=10, Durchläufe=20, WarmUp=3) zu sehen:

  • AreaChart (Durchschnitt)
    • JavaFX 2: 377,8 FPS
    • JavaFX 8: 402,1 FPS
    • JavaFX 9 (ea110): 399,5 FPS
  • AreaChart (Durchschnitt & Fullscreen)
    • JavaFX 2: 256,1 FPS
    • JavaFX 8: 259,9 FPS
    • JavaFX 9 (ea110): 258 FPS
Das Ergebnis ist: JavaFX 8 (und auch JavaFX 9) ist ungefähr 4% schneller als JavaFX 2.

Ergebnis

Wenn wir diese Ergebnisse nun alle zusammen rechnen kommen wir auf folgendes Gesamtergebnis:


  • Gesamt (Durchschnitt)
    • JavaFX 2: 194 FPS
    • JavaFX 8: 270 FPS
    • JavaFX 9 (ea110): 266 FPS
  • Gesamt (Durchschnitt & Fullscreen)
    • JavaFX 2: 127 FPS
    • JavaFX 8: 152 FPS
    • JavaFX 9 (ea110): 152 FPS

Das Ergebnis ist: JavaFX 8 ist 24% und JavaFX 9 ist 23% schneller als JavaFX 2!

Review

Man sieht also, dass nur die Bitmap Bewegungen zu vergleichen nicht Aussagekräftig genug ist, um die Performance zwischen den verschiedenen JavaFX Versionen zu vergleichen. Besonders der ListView Benchmark zeigt, dass sich JavaFX 8 extrem gesteigert hat, während es beim AreaChart Diagramm kaum Unterschiede gibt. Daher ist es umso wichtiger einen Benchmark zu entwickeln, welcher im Optimalfall alle Komponenten von JavaFX bewerten kann. Ich werde mich definitiv nach meiner Masterarbeit weiter daran machen noch mehr Benchmarks zu BenchmarkJFX hinzuzufügen um dies zu erreichen. Wer will kann sich das Projekt gerne mal auf Github anschauen und vielleicht auch erweitern oder für eigene Zwecke nutzen!

Damit ist das Thema JavaFX Performance zunächst einmal für mich erledigt, da ich mich noch mit anderen Themen rund um JavaFX auseinander setzen muss =). Ich hoffe es hat euch gefallen und bis zum nächsten mal!

Keine Kommentare:

Kommentar veröffentlichen