JavaFX GUI Komponenten werden langsam bei größerer Datenmenge

da921610

Aktives Mitglied
Hallo liebes Forum,
ich sitze hier gerade an einem JavaFx Problem(chen).
Und zwar wollte ich mal einen Belastungstest bei einer ComboBox durchführen und habe dabei festgestellt, dass bei größerer Datenmenge das Control ziemlich träge wird.

Dabei hab ich zwei verschiedene Sachen getestet.

In meinem Controller habe ich zwei ComboBoxen

@FXML private ComboBox<MyObject> cbo_firstComboBox
@FXML private ComboBox<String> cbo_secondComboBox

Zur ersten:
In der MyObject-Klasse sind einige Attribute drin und auch eine toString()-Methode, die ja letztendlich für die Darstellung des anzuzeigenden Wertes in der Combobox liefert.

Zur zweiten:
Einfach nur String-Elemente


Nun bin ich her gegangen und habe für beide Comboboxen jeweils ca. 3000 Einträge erzeugt und der ComboBox hinzugefügt.

Bei der zweiten Combobox mit <String> war die Rechenzeit doch recht überschaubar, bei der ersten jedoch mit <MyObject> dauert das schon einiges an Zeit.

Nun meine Frage, irgendwelche Ideen, wie ich das ganze Beschleunigen kann?
 
Erste Frage: Welches Betriebssystem?

Ich selbst habe bei mir auf dem Laptop mit Ubuntu die Beobachtung gemacht, das nicht die diskrete Graphikkarte genutzt wird, sondern die integrierte Intel-HD. Das führt regelmässig dazu, das bei einer etwas komplexeren Anwendung bei mir der Staubsauger angeht...

Um das zu überprüfen kannst du die Anwendung mit den zusätzlichen Java-Parametern
"-Dprism.verbose=true -Djavafx.verbose=true"
Das schreibt dir so einiges auf System.err

Dann: Die Frage nach dem Sinn. Warum gerade eine ComboBox so testen - ist das nicht eher unrealistisch?

Bei eigenen Objekten kommt es vielleicht auch noch darauf an, wie du das Databinding machst. Ich glaube, da kann man auch Dinge gern falsch machen, bin aber ehrlich gesagt auch kein Experte und kann dir da proforma auch keine "Super-Sauber"-Lösung bieten.
 
Kleiner Nachtrag: ComboBox nutzt intern einen ListView zur Darstellung der Daten. Daher habe ich mal kurz etwas herumgesucht:

"javafx listview performance"
-> da sieht man schon, das die Performance bei vielen Objekte nicht unbedingt optimal ist - und das, obwohl die Liste schon theoretisch nur die Zellen rendert, die zu sehen sind (mal ein paar Logs in deinen CellFactory würgen, dann siehst du das auch auf der Konsole)

"javafx listview virtual"
-> Vielleicht kann dir eine Lib wie die hier helfen: https://github.com/TomasMikula/Flowless
 
Hey,
vielen Dank für die Rückmeldung.

Ich habe das mal an einer ComboBox getestet, weil nach dem Prinzip von JavaFx Objekte direkt an die Komponenten gelegt werden können. Das betrifft ja nicht nur eine normale ComboBox, sondern noch mehr zum Beispiel den TableView oder den TreeView. Ich denke mal, dass dort das gleiche Problem auftreten kann, wenn viele große Objekte drauf gelegt werden.

Aber nun zu deinem Beitrag.
Betriebssystem spielt keine Rolle, da es eher eine generelle Problematik ist und ich zumindest drauf vorbereitet sein möchte, falls meine Applikation(en) mal Probleme mit Performance bereiten.

Was meinst du denn genau, was man beim Databinding falsch machen kann. Gibts da irgendwelche allgemeingülltige Hinweise, die ich beachten kann?

Und der ListView soll generell ziemlich unperformant sein, was natürlich auch einen Beitrag dazu leisten kann...

Aber schonmal vielen Dank für die Bemühungen 🙂
 
Vielleicht kannst du ja mal etwas Code liefern, dann könnte man mal drüberschauen und versuchen zu optimieren.
Nur aus Neugier: Wie lädst du die Daten rein? En bloc oder peu à peu? Weil du natürlich auch die Liste asynchron befüllen könntest. Ob das jetzt besser klappt, weiss ich nicht. Und ohne deinen Code wird es auch für mich eher schwierig, daran herum zu optimieren ;-)
 
Wenn Du 3000 Daten gleichzeitig darstellen willst, hast Du definitiv ein Konzeptproblem. Welcher Mensch kann denn mit 3000 Daten etwas anfangen. Reduziere die Daten auf das was der User braucht, bzw was ihn interessiert. Das sollte in der Regel nicht mehr als 20 Daten sein. Selbst in einer Tableview würde ich ab 20 Datensätzen mit Paging und Filtering arbeiten weil es sonst einfach unübersichtlich wird. Eine Ausnahme bilden nur Grafiken aber da hast du auch kein Performance-Problem bei 3000 Punkten.

Gruß

Claus
 
Naja, es gibt sicher schon Einsatzgebiete, wo in Tabellen mal gerne etwas mehr Daten enthalten sein können. Aber ich würde gerade bei Listen auch eher auf Klasse, statt Masse, setzen.
 

Neue Themen


Zurück
Oben