Listener und Performance

Status
Nicht offen für weitere Antworten.

manuche

Bekanntes Mitglied
Hallo.

Ich beginne grade als Übung eine 2D Physikengine in Java umzusetzen... Dazu baue ich mir erstmal eine Vektorklassen zusammen. Ganz stumpf beinhaltet diese erstmal eine x y Koordinate von Anfang und Endpunkt... Darüber hinaus soll noch eine Membervariable für die Länge implementiert sein.
Wenn jetzt ein x oder y Wert geändert wird kann sich unter Umständen auch die Länge des Vektors ändern!
Meine Idee war nun, einen Listener für die Variablen zu erstellen, um gegebenfalls die Länge zu aktualisieren.
Ist diese sinnvoll bzw wenn performant genug? Schliesslich kann ich die Länge ja auch ausrechnen falls ich die Variable abfrage.
Wenn sich das aus Sicht der Performance nichts nimmt würde ich halt zum Listener tendieren.

gruß manuche
 

Illuvatar

Top Contributor
Naja, also - logisch wäre es, die Länge in setX bzw. setY neu zu berechnen. Wenn du es erst in getLength machst, kann es eventuell ein kleines bisschen performanter sein. Sicher aber nicht so viel, dass man es merkt - außerdem wäre dann die Frage ob du das in getLength immer berechnest, oder ob du dann halt irgendwie speicherst ob du berechnen musst und so...
 

Marco13

Top Contributor
Das ist ein bißchen heikel. Selbst in der offiziellen javax.vecmath-Bibliothek wurde (vermutlich (damals noch) aus Effizienzgründen) das (eigentlich) nicht akzeptable Designverbrechen begangen, die x,y,z-Komponenten bei einem Vector3f als public float umzusetzen.

Gerade bei der Berechnung der Länge wird es besonders kritisch: Es ist SEHR, SEHR aufwändig, die Länge zu berechnen (Wurzel ziehen). Wenn du z.B. eine Simulation schreibst, wo von 1000 Punkten in einem Schritt 1000 mal die x,y-Koordinaten geändert werden, willst du mit Sicherheit nicht 1 Million mal irgendwelche Listener benachrichtigen und Längen berechnen - zumal die Längen ja vielleicht garnicht gebraucht werden!

Ich würde dir empfehlen, die Länge nicht als member zu speichern, sondern nur eine Methode "getLength" anbieten, die die Länge jedes Mal neu ausrechnet. Den Wert "zwischenzuspeichern" (wenn er mehrfach benötigt wird, und sich zwischendurch nichts ändert) könnte ggf. der Aufrufer übernehmen.

Eine mögliche Alternative wäre vielleicht (!!! das muss man sich überlegen !!!) die Länge als member zu speichern, und bei jeder Änderung der Koordinaten auf "-1" zu setzen (quasi um zu signalisieren: "Die Länge ist ungültig"). In der Methode getLength wird die Länge dann NUR neu berechnet, wenn sie -1 ist, und ansonsten die schon berechnete Länge zurückgegeben.

Natürlich kann (und sollte) man auch die verschiedenen Ansätze mal implementieren, und bei einem praktischen Beispiel mit einem Profilerlauf feststellen, wo die meiste Rechenzeit verbraten wird.

Aber selbst bei der grundlegenderen Frage, ob so was Primitives wie ein 2D-Vektor überhaupt Listener haben sollte, sollte man sich Gedanken machen...

Ein Ansatz, der im ersten Moment ein bißchen absurd klingt, den man aber evtl. auch in Erwägung ziehen könnte, wäre sowas wie eine Klasse "Vector2D" und eine Klasse "Vector2DWithListeners extends Vector2D" zu erstellen (oder beides über Interfaces), und nur letztere bietet die Möglichkeit, Listener anzuhängen, aber das ist ein ziemlich gewagter und in keinster Forum durchdachter Spontan-Gedanke.
 

Marco13

Top Contributor
Auch auf die Gefahr hin, dass du den obigen Beitrag noch nicht gelesen hattest: Bei dem Wort "Ballast" fällt mir auch noch ein, dass es ja ggf. SEHR viele Vectoren geben wird. Vielleicht auch viele, die nur für Zwischenrechnungen verwendet werden. Wenn man in jedem Vector eine ArrayList mit Listenern speichert, dann braucht ein Vector "standardmäßig" schonmal nicht 2*4+x = 8+x bytes (für ein Objekt (x) und 2 floats) sondern >2*4+4+4+10*4+x = 56+x bytes (für ein Objekt (x), eine Referenz auf die Liste, eine Referenz auf den Array, 10 Array-Einträge, und noch ein paar Kleinigkeiten). Je nach Zusammenhang und Art der Anwendung könnte das ja auch von Bedeutung sein....

EDIT: Aber um das nochmal klar zu sagen: Ich will dir die Listener nicht "ausreden", sondern nur verdeutlichen, dass es - abhängig davon, was du vorhast!!! - einige Punkte geben KÖNNTE, die dagegen sprechen KÖNNTEN.
 

BjörnBu

Aktives Mitglied
Hmm

Den "schönsten" Verktor fände ich den, der ohne memer für die Länge aus kommt. Am performatesten dürfte das sein, was die Länge so selten wie möglich berechnet und das ist wohl Marcos Idee die Länge bei Änderungen auf -1 (o.ä.) zu setzen.

Initial wird der Wert auch auf -1 gesetzt und nur beim Aufruf getLength() berechnet, wenn er grade -1 ist.

Halte die Idee für sehr gut und wenn ich nichts übersehe auch quasi-optimal. Du Berechnest die Länge so immer nur, wenn unbedingt notwendig und hast nur ein einzelnen member mehr als unbedingt notwendig, der Speicher braucht.

Die einzige Situation, die mir jetzt einfällt, in der das nicht optimal ist, ist wenn es sehr viele Vektoren gibt aber unglaublich selten die Länge gefragt ist. Dann könnte die Lösung ganz ohne member minimal besser abschneiden.

Eine Situation wo der Listener "gewinnt" fällt mir spontan gar nicht ein.
 

Marco13

Top Contributor
BjörnBu hat gesagt.:
Die einzige Situation, die mir jetzt einfällt, in der das nicht optimal ist, ist wenn es sehr viele Vektoren gibt aber unglaublich selten die Länge gefragt ist. Dann könnte die Lösung ganz ohne member minimal besser abschneiden.
"Besser" in bezug auf was? Effizienter ist es wohl auch dann nicht, aber ... ist eben einer der vielen Fälle, wo man einen Tradeoff zwischen Rechenzeit und Speicherverbrauch hat.... Deswegen auch der Hinweis, dass man die Anwendungsszenarien kennen und (selbst dann noch) ein paar Profilerläufe machen sollte...
 

Illuvatar

Top Contributor
Ich an deiner Stelle würde es so machen, wie es BjörnBu jetzt auch geschrieben hast. Einzig allein in Bezug auf den Speicherverbrauch könnte es noch etwas besser gehen. Falls du später trotzdem noch irgendwelche Probleme haben solltest, kann dir ein Profiler am Besten sagen, wo die liegen.
 

Tobias

Top Contributor
Zum Thema scheint alles gesagt, deshalb nur noch ein Wort zu deiner Signatur:

Das hängt davon ab, wie weiß und wie teuer der Teppich ist.
 

FArt

Top Contributor
Wie Illuvatar:
mach dir Gedanken um die Performance, wenn es Probleme gibt. Ziehe ein sauberes Design vor.

Das Observerpattern setzt man sinnvoll ein, wenn zwei voneinander getrennte Bereiche (Objekte) dieses Verhalten realisieren müssen. In einem Objekt mit allen Attributen ist das unnötig. Die Optimierungen, wann und wie die Länge berechnet werden soll, ob ein Flag für die Ungültigkeit eingeführt werden soll usw. kannst du nach Bedarf übernehmen.

Die 3 Grundregeln des Optimierens: optiemiere spät, optimiere spät, optimiere spät. Danach zählt: optimiere bei Bedarf, nur bei konkreten Problemen und nur dann, wenn eine signifikante Verbesserung dadurch zu erwarten ist.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Was heißt es mit FXML Listener zu setzen ind Buttons zu erstellen? Allgemeine Java-Themen 6
L Wie programmiert man einen Listener? Allgemeine Java-Themen 1
S Threads Serielle Schnittstelle mit Listener / Aufrufendes GUI Allgemeine Java-Themen 4
H Listener Verständnisproblem Allgemeine Java-Themen 5
D Action Listener Problem Allgemeine Java-Themen 3
S Key Listener mit Strg + s Allgemeine Java-Themen 12
K Threads Listener für Future finish Allgemeine Java-Themen 2
TheWhiteShadow Listener Reihenfolge Allgemeine Java-Themen 4
D Listener auf System.out.err / System.out.println Allgemeine Java-Themen 5
A Listener für constructor einer bestimmen Klasse Allgemeine Java-Themen 9
E Bild mit Listener einfügen Allgemeine Java-Themen 3
P Listener für Tastatureingaben ohne Focus Allgemeine Java-Themen 4
serjoscha WatchDog Thread und Listener Allgemeine Java-Themen 10
hdi Listener für Desktop-Veränderungen Allgemeine Java-Themen 7
T JTextField in Listener leeren Allgemeine Java-Themen 2
lenniii Listener & JList Allgemeine Java-Themen 3
K Key listener ohne Fokus aktiv behalten ? Allgemeine Java-Themen 12
G Code-Convention für Listener Allgemeine Java-Themen 2
T Observer vs Listener Allgemeine Java-Themen 18
S Listener Allgemeine Java-Themen 3
P Abstrakte Elternklasse als Listener Allgemeine Java-Themen 6
MQue KeyAction listener Allgemeine Java-Themen 2
M generische Listener Allgemeine Java-Themen 2
S Listener für Kalender Allgemeine Java-Themen 2
B Observer vs Listener (GUI-Programmierung) Allgemeine Java-Themen 5
J Listener für Ende eines Threads gesucht... Allgemeine Java-Themen 5
S Listener Implentierung bei Eingabe in Textfeld Allgemeine Java-Themen 2
G Objekt einer inneren Klasse als Listener Allgemeine Java-Themen 3
D Boolean Listener? Allgemeine Java-Themen 28
D Observer/Observable Pattern vs. Listener-Konzept Allgemeine Java-Themen 4
G Listener auf aktuelles Datum / Uhrzeit Allgemeine Java-Themen 2
Escorter Eigenen Listener schreiben Allgemeine Java-Themen 3
E Gibt es so etwas wie einen Windows Listener? Allgemeine Java-Themen 6
T SelectionProvider und Listener Frage Allgemeine Java-Themen 14
I Listener, der zeitlich-periodisch aufgerufen wird Allgemeine Java-Themen 3
R Generische Listener und Sender Allgemeine Java-Themen 12
B Listener dynamisch setzen Allgemeine Java-Themen 6
A Listener Tastatur Allgemeine Java-Themen 3
E Wie: Eigener Listener, eigenes Event (möglichst einfach) Allgemeine Java-Themen 29
D Thread vs Listener Allgemeine Java-Themen 6
K Listener einem Objekt hinzufügen Allgemeine Java-Themen 3
S Listener-Problematik in komplexem Projekt Allgemeine Java-Themen 2
I Listener/Event selber machen. Allgemeine Java-Themen 4
M Time Listener ? Allgemeine Java-Themen 2
Z Zwei Listener zwischen zwei Klassen Allgemeine Java-Themen 4
B statusbar update -> mit thread oder listener? Allgemeine Java-Themen 7
M Action-listener Allgemeine Java-Themen 6
M Bean Listener hinzufügen und Methode später überschreiben Allgemeine Java-Themen 27
G Flavor-Listener Allgemeine Java-Themen 6
E Listener für Änderung der Fenstergröße Allgemeine Java-Themen 3
W Listener an ein beliebiges Objekt hänger, der mir Änderung Allgemeine Java-Themen 8
Z Problem beim Aufruf eines Listener? Allgemeine Java-Themen 4
A HILFE: subclass von Hashtable mit listener aufstellen Allgemeine Java-Themen 5
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
H Performance einer Monte-Carlo-Simulation verbessern Allgemeine Java-Themen 6
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
H Watson-Crick-Complement Performance Allgemeine Java-Themen 18
L Best Practice Auslagerung von Code = Performance Optimierung? Allgemeine Java-Themen 4
B Performance Messungen Allgemeine Java-Themen 4
J Threads verbessern die Performance NICHT ? Allgemeine Java-Themen 8
X Performance für Tomcat / Apache optimieren Allgemeine Java-Themen 2
I Performance - JDBC UPC PoolDataSoure Allgemeine Java-Themen 0
E Lambda filter performance Allgemeine Java-Themen 2
D Performance-Probleme mit Joda-Time Allgemeine Java-Themen 3
A Jasper Report Performance bei PDF erzeugen Allgemeine Java-Themen 0
A Best Practice Variablen vertauschen - Performance Allgemeine Java-Themen 1
R DBUnit Performance Probleme Allgemeine Java-Themen 0
P Performance: super explizit erwähnen oder weglassen? Allgemeine Java-Themen 5
S starke performance probleme des forums Allgemeine Java-Themen 10
C Performance Tips Allgemeine Java-Themen 13
A Performance/Speicherplatz-Nutzung bei Tests Allgemeine Java-Themen 6
R Java Performance testen Allgemeine Java-Themen 18
StrikeTom Java Performance Fragen Allgemeine Java-Themen 5
V Performance steigern Allgemeine Java-Themen 7
D Reflection-Performance Allgemeine Java-Themen 7
M Einfluss von Caching auf die Performance (große Arrays) Allgemeine Java-Themen 24
R Collections Performance einer HashMap Allgemeine Java-Themen 26
i<3java [Groovy/Grails](oder auch java) Mögliche Performance Probleme bei Mailversendung Allgemeine Java-Themen 2
D Performance Objektallokation Allgemeine Java-Themen 28
J Java Performance nicht nachvollziehbar Allgemeine Java-Themen 3
I Library für High Performance Mime Type Erkennung Allgemeine Java-Themen 8
S Performance Frage: Objekt oder static? Allgemeine Java-Themen 33
M Runtime.exec() - Performance / Frage zu Threads Allgemeine Java-Themen 5
M Performance Allgemeine Java-Themen 6
M Performance Allgemeine Java-Themen 5
E Performance website download Allgemeine Java-Themen 13
MQue Performance Methodenaufruf - if Abfrage Allgemeine Java-Themen 19
hdi Was frisst in meinem Programm den Speicher / verschlechtert die Performance Allgemeine Java-Themen 11
J Performance von Java GUI-Anwendungen Allgemeine Java-Themen 2
U Java Performance im Vergleich zu C++ in speziellem Anwendungsfall Allgemeine Java-Themen 6
S Performance und Function Call Depth Allgemeine Java-Themen 6
H Performance Vorteil durch Wechsel der JVM? Allgemeine Java-Themen 6
A Performance: byte[] in byte[][][] konvertieren Allgemeine Java-Themen 2
T Performance ArrayList#remove Allgemeine Java-Themen 8
ARadauer Performance Pptimierung -Lesen/Schreiben Allgemeine Java-Themen 10
Chris81T Performance Problem durch mehrfaches Starten eines JAVA Prog Allgemeine Java-Themen 8
G Hibernate, JTable und Performance Allgemeine Java-Themen 17
P Performance: Ziehen ohne Zurücklegen (große Datenmenge) Allgemeine Java-Themen 10
D Performance: ArrayList vs. Array vs. "Eigene Liste&quot Allgemeine Java-Themen 8
M nichtreferenzierte Objekte auf NULL setzen -> Performance Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben