Optimierung einer Berechnung

Network

Top Contributor
Hi,

ich habe ein Spiel programmiert und muss innerhalb von wenigen Millisekunden an die 1000x1000 Berechnungen von einzelnen Spielfeldern durchführen.

Meine erste überlegte Variante ging schief und war viel zu langsam.

Ich weiss jetzt nicht welche Variante ich als nächstes Einsetzen sollte, vieleicht hat ja jmd. eine Entscheidungshilfe für mich.

1. Alle Felder in eine Liste (Vector/ArrayList) packen, mit einem einzigartigen Namen (Position) und dem zu verwertenden Wert.
- Nachteil: Da ich immer wieder die Nachbarfelder abfragen muss, muss ich immer wieder die gesammte Liste durchgehen und nach den Nachbarfeldern suchen.
- Vorteil: Jedoch muss ich in der Liste nicht alle Spielfelder aufnehmen sondern nur die zu berechnenden (steigende Zahl)

2. Alle Felder als Array[1000][1000] speichern.
- Nachteil: Ich muss zu jedesmal alle Felder überprüfen
- Vorteil: Ich weiss an welcher Stelle die Nachbarfelder sind

Ich weiss nicht für welche Methode ich mich entscheiden sollte... Ich möchte halt nicht eine völlig neue Methode ins Spiel implementieren, um später feststellen zu müssen, dass sie wieder viel zu langsam ist.
Besonderst ist halt die Frage ob Arrays schneller sind als Vectoren/ArrayLists

Vielen Dank schonmal
 
B

bERt0r

Gast
Du könntest eine Klasse Spielfeld machen und dem Feld seine 8 Nachbarn als Membervariablen zuweisen.
 
M

Marcinek

Gast
Das hängt davon ab, was auf den Feldern ist und welche Berechnungen es sind.

Kannst du es nicht Clustern und die Berechnungen in vier Threads machen?

Sind alle Felder gleichzeitig Sichtbar? - Wenn nein, sollte man nur den Sichtbaren bereich neu berechnen.

Gruß,

Martin
 

Marco13

Top Contributor
Du solltest mehr Infos posten (was für Felder, was für Abfragen...?). Im Allgemeinen sind Arrays schon das schnellste, was man verwenden kann, und speziell wenn die Größe sich nicht ändert sollte man bei Zeitkritischen Interna schon Arrays verwenden (nur nicht über getter nach draußen geben oder so...)
 

Landei

Top Contributor
Wie mein Vorredner sagte, sind hier Arrays angesagt. Um sich die Tests auf Randfelder zu sparen, wird oft ringsherum um das eigentliche Spielfeld ein "Rahmen" ungenutzer, leerer, blockierender u.s.w. Felder benutzt.
 

Network

Top Contributor
-> Das ganze Prinzip zu erklären ist recht schwierig. In etwa muss so etwas wie bei "conways Game Of Life" berechnet werden. Es trifft das Spielprinzip zwar nicht, war aber meine ursprüngliche Überlegung das ganze in etwa so umzusetzen.

Du könntest eine Klasse Spielfeld machen und dem Feld seine 8 Nachbarn als Membervariablen zuweisen.

Vielen Dank, logisch, beschleunigt das ganze natürlich um einiges.

Das hängt davon ab, was auf den Feldern ist und welche Berechnungen es sind.
Kannst du es nicht Clustern und die Berechnungen in vier Threads machen?
Sind alle Felder gleichzeitig Sichtbar? - Wenn nein, sollte man nur den Sichtbaren bereich neu berechnen.

-> 4 verschiedene Threads? Da sich die Threads abwechseln und Java leider auch keine Multicoreberechnungen unterstützt... sind die 4 Threads nicht genausoschnell wie einer?
-> Letzten Punkt habe ich bereits abgehaakt. Jedenfals werden die Berechnungen abgespeckt.

Du solltest mehr Infos posten (was für Felder, was für Abfragen...?). Im Allgemeinen sind Arrays schon das schnellste, was man verwenden kann, und speziell wenn die Größe sich nicht ändert sollte man bei Zeitkritischen Interna schon Arrays verwenden (nur nicht über getter nach draußen geben oder so...)

Ok, Array habe ich jetzt eingesetzt. Wobei ich etwas neugierig bin was das getter angeht. So schlimm?
Jedem Objekt, dass das Array unbedingt benötigt, habe ich die Addresse des Arrays übergeben.
 

Fu3L

Top Contributor
-> 4 verschiedene Threads? Da sich die Threads abwechseln und Java leider auch keine Multicoreberechnungen unterstützt... sind die 4 Threads nicht genausoschnell wie einer?

Das würde ja Threads bis auf bei nicht-blockierenden GUIs ad absurdum führen und noch mehr sowas neues wie das fork&join-Framework wie Zeitverschwendung erscheinen lassen^^

Ich kann nicht sicher sagen, dass du unrecht hast, aber es würde mich sehr wundern, wenn es stimmen würde ;)
 

theuserbl

Bekanntes Mitglied
Im Allgemeinen sind Arrays schon das schnellste, was man verwenden kann, und speziell wenn die Größe sich nicht ändert sollte man bei Zeitkritischen Interna schon Arrays verwenden (nur nicht über getter nach draußen geben oder so...)

Ok, Array habe ich jetzt eingesetzt. Wobei ich etwas neugierig bin was das getter angeht. So schlimm?

Die Aussage mit dem Getter und Setter finde ich auch sehr interessant.
Das klingt so, als sollte man objektorientiert und mit Setter und Getter programmieren, wenn das Programm leicht lesbar und wartbar sein soll.
Will man jedoch performante Programe schreiben, sollte man hingen möglichst nur statische Methoden erstellen und nutzen und schön prozedural programmieren. :)

Grüße
theuserbl
 

Fu3L

Top Contributor
Ich verstehe es so, als wenn man sein Array nicht per Getter nach außen geben sollte, weil sonst jeder drin rumwursten und alles verändern kann und das zu Chaos führt. Man muss also nach außen das Array wieder abstrahieren.
Also sowas: getInformation(Point xy). Die Klasse, die das Array beinhaltet, sucht dann anhand der Koordinaten die Information aus dem Array.
 

theuserbl

Bekanntes Mitglied
@ Fu3L: Oh man, das wird jetzt etwas off topic. Aber als ich Dein Posting las, mußte ich erst mal lachen... :D

Ich verstehe es so, als wenn ...

Der Witz ist: Da schreibt ein Forumsmitglied etwas ins Forum und die restlichen Forenmitglieder fangen an zu interpretieren, wie es gemeint sein könnte. :lol:

Grüße
theuserbl
 

Marco13

Top Contributor
Ja, und was ist daran so lustig? (Hm... ich bin wohl humorlos... und drücke mich unklar aus). Ich meinte nur, dass es Nachteilhaft sein kann, wenn man sowas macht wie
Java:
class Board {
    private int array[][];
    public int[][] getArray() { return array; }
}
und jeder dann sowas macht wie
Java:
void drawSomething() {
    drawLine(board.getArray()[12][45], board.getArray()[4][67]);
    ...
}
Einerseits, weil jeder darin rumpfuschen kann, aber der wichtigere Grund ist, dass man auf diesen Array festgelegt ist: Bei einem 1000x1000-Feld würde überall davon ausgegangen, dass das ein [c]int array[1000][1000] [/c] ist. Wenn es irgendwann mal ein int[1000*1000] oder gar einen long[][] werden soll, oder noch mehr, oder wenn man in Anlehung an Landei's Hinweis dann einen 1002x1002-Array verwenden will, um ein 1000x1000-Feld zu modellieren, ist man ge'screw'ed....
 

tagedieb

Top Contributor
Das würde ja Threads bis auf bei nicht-blockierenden GUIs ad absurdum führen und noch mehr sowas neues wie das fork&join-Framework wie Zeitverschwendung erscheinen lassen^^

Ich kann nicht sicher sagen, dass du unrecht hast, aber es würde mich sehr wundern, wenn es stimmen würde ;)

Hab mal von einem Projekt gehoert, da haben sie eine ambitionierte Multithreadingloesung entwickelt und alles schoen ueber die Konfiguration gesteuert. Am Schluss mussten Sie leidlich feststellen, dass die Sofware mit nur 1 Thread am schnellsten laeuft, da das Zielsytem nur einen Prozessor hatte.... :autsch:
 

parabool

Bekanntes Mitglied
Die Position der zu berechnenden Felder im Array könnte man in einer Liste speichern.
Wenn Du z.B. nur 10 Felder hast musst Du auch nur diese im Array abfragen.

Nebenbei: Wenn sich bei den Berechnungen die Zustände der Felder ändern können bzw. Felder wegfallen/hinzukommen, muss der vorherige Zustand der Matrix berücksichtigt werden.

(Bei Game Of Life: Alle Felder beziehen sich bei den Berechnungen auf dieselbe Generation/Berechnungsdurchlauf)
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Am Schluss mussten Sie leidlich feststellen, dass die Sofware mit nur 1 Thread am schnellsten laeuft, da das Zielsytem nur einen Prozessor hatte.... :autsch:

Man kann davon ausgehen, dass die Anzahl der Kerne in einem Desktop-PC sich alle 18 Monate verdoppeln wird. Im Moment sind 4 normal, in 1.5 Jahren werden 8 normal sein....
 
B

bERt0r

Gast
Zu deiner Ursprünglichen frage bzgl dem Game of life:
Du könntest ein 1000x1000 boolean Array und ein Hashset machen, in dem Du die Koordinaten der lebenen Zellen speicherst, z.b. als Point.
Pro zyklus iterierst du das Hashset durch, angrenzende Punkte kannst du bequem über das Array überprüfen. Das hashset verhindert auch, dass du Zellen mit gleichen Koordinaten doppelt hineinspeicherst.
 

Network

Top Contributor
Einerseits, weil jeder darin rumpfuschen kann, aber der wichtigere Grund ist, dass man auf diesen Array festgelegt ist: Bei einem 1000x1000-Feld würde überall davon ausgegangen, dass das ein [c]int array[1000][1000] [/c] ist. Wenn es irgendwann mal ein int[1000*1000] oder gar einen long[][] werden soll, oder noch mehr, oder wenn man in Anlehung an Landei's Hinweis dann einen 1002x1002-Array verwenden will, um ein 1000x1000-Feld zu modellieren, ist man ge'screw'ed....
Done ;)

Die Position der zu berechnenden Felder im Array könnte man in einer Liste speichern.
Wenn Du z.B. nur 10 Felder hast musst Du auch nur diese im Array abfragen.

Nette Idee die ich auch hatte. Da ich jedoch eh jedes Feld durchgehe um das Spielfeld zu zeichnen, hab ich darin auch die Abfrage für jedes Feld integriert, fals notwendig - was sich entscheidet ob das Feld aktiv ist oder nicht.

Zu deiner Ursprünglichen frage bzgl dem Game of life:
Du könntest ein 1000x1000 boolean Array und ein Hashset machen, in dem Du die Koordinaten der lebenen Zellen speicherst, z.b. als Point.
Pro zyklus iterierst du das Hashset durch, angrenzende Punkte kannst du bequem über das Array überprüfen. Das hashset verhindert auch, dass du Zellen mit gleichen Koordinaten doppelt hineinspeicherst.

Auch eine sehr gute Idee, lässt sich bei mir leider nicht umsetzen. Da mein Spielprinzip weitaus komplizierter ist oder wird :)


Ich habe jetzt die meisten Tipps soweit es möglich war(evt. leicht modifiziert) ins Game eingebaut und ich muss sagen: TOP! :toll:
Es ist wunderbar schnell... leider kommt jetzt die repaint-methode nicht mehr mit, während repaint noch beim zeichnen ist, wird repaint bis zu 10 mal erneut aufgerufen . Ich wusste nicht, dass repaint ein eigener Thread ist. Tja extrem schnell ist dann halt doch manchmal ein Nachteil :D

Ich Bedanke mich herzlich.
 

Fu3L

Top Contributor
Rufst du zwischenzeitlich immer Thread.sleep(someTimeInMillis) auf? Das empfiehlt sich (insbesondere auf Einkernprozessoren). Dann kommt auch der andere Thread* mit dem Zeichnen hinterher ;)
Wenn du eh nicht schneller malen kannst, nützt es ja auch nichts, den Spielzustand öfters zu berechnen^^

*: Zweifle gerade wegen seines Namens daran, ob das der Event Dispatch Thread macht, wovon ich eigentlich ausging?^^
 
Zuletzt bearbeitet:
B

bERt0r

Gast
Also ich bin ja mehr ein Fan von yield(), da kriegst du auch keine InterruptedExceptions.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
L Best Practice Auslagerung von Code = Performance Optimierung? Allgemeine Java-Themen 4
F Zeit Optimierung - bzw. ms Optimierung Allgemeine Java-Themen 35
R Optimierung beim Vergleichen von 2 Bildern Allgemeine Java-Themen 23
HarleyDavidson Regex - Optimierung Allgemeine Java-Themen 4
K Optimierung kürzester Weg im Warenlager Allgemeine Java-Themen 8
O Algorithmus Optimierung Allgemeine Java-Themen 3
H Optimierung durch Threads Allgemeine Java-Themen 31
C Programmflow-Optimierung Allgemeine Java-Themen 7
G Klasse Optimierung Allgemeine Java-Themen 6
S jdk versus openjdk - Optimierung von Konstanten? Allgemeine Java-Themen 8
P Optimierung (&& ||) deaktivieren / umgehen? Allgemeine Java-Themen 9
G Optimierung StringBuilder Allgemeine Java-Themen 9
S Optimierung vom Laden von Grafiken Allgemeine Java-Themen 4
S Brainstorming --> Optimierung vonn Gefälleplatten Allgemeine Java-Themen 8
D Optimierung beim Casten Allgemeine Java-Themen 4
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
T JNA, Aufruf der Funktionen einer dll Allgemeine Java-Themen 5
I Vom Monolith zu Services in einer Webseite Allgemeine Java-Themen 1
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
I Wie kann ich den Wert aus einer If abfrage ausgeben Allgemeine Java-Themen 23
S HTML einer Webseite 1:1 so bekommen wie es auch der Browser anzeigt? Allgemeine Java-Themen 14
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
J (Geplante) Änderungen an einer Datei vorübergehend speichern und anwenden? Allgemeine Java-Themen 12
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
_user_q Obfuscate einer .jar-Datei mit ProGuard? Allgemeine Java-Themen 2
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
C Parsen einer sich updatenden Html mithilfe von jsoup Allgemeine Java-Themen 4
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Performance einer Monte-Carlo-Simulation verbessern Allgemeine Java-Themen 6
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
Zeppi NullPointerException in einer if-Abfrage Allgemeine Java-Themen 6
D Abbruch einer ViewScoped Bean in Arbeit Allgemeine Java-Themen 2
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
Lukas2904 Wie kann man cps (ClicksPerSecond) in einer GUI anzeigen lassen? Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
N BlueJ Implementation einer Analoguhr Allgemeine Java-Themen 0
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
N Speicherort einer Datei im Explorer ändern Allgemeine Java-Themen 8
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
J Zerlegen einer Zahl Allgemeine Java-Themen 6
Zrebna Wie kann man endgültig aus einer Rekursion ausbrechen? Allgemeine Java-Themen 14
MiMa Person in einer Arraylist hinzugügen mit Prüfung ? Allgemeine Java-Themen 6
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
MiMa Prüfziffer einer EAN Nummer berechnen Allgemeine Java-Themen 4
MiMa Erstellungsdatum einer Datei Allgemeine Java-Themen 10
Drachenbauer Wie kann ich einer existierenden Enum von außerhalb veränderte Werte zuweisen? Allgemeine Java-Themen 5
S HTML den ich von einer URL hole nicht identisch mit dem HTML im Browser Allgemeine Java-Themen 1
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8
M Hilfe bei einer Java Programmieraufgabe! Ab morgen Montag um 08:00 Uhr Allgemeine Java-Themen 5
J Algorithmen Analyse einer Schleife Allgemeine Java-Themen 6
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
A Mithilfe von einer Nummer einen Namen finden n-Beziehung Allgemeine Java-Themen 8
Scream_ilias Auf einer Website die anmeldedaten eingeben Allgemeine Java-Themen 9
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
I Lohnt sich heutzutage der Aufwand einer Portierung für MacOS Allgemeine Java-Themen 8
J Suchen von einer Scannereingabe in einem HashSet Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
L Echtzeitdaten aus einer Webseite ziehen mit Java Allgemeine Java-Themen 19
V EMail, Attachments auslesen von einer Email Allgemeine Java-Themen 0
T Google Links in einer Liste Allgemeine Java-Themen 4
T Sinn einer toString Methode Allgemeine Java-Themen 3
P Durchlaufen einer Queue Allgemeine Java-Themen 9
J Größe einer CD ermitteln Allgemeine Java-Themen 10
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
H Länge einer verketteten Liste Allgemeine Java-Themen 4
B Quellcode einer Java libary finden um zu copy & paste'n Allgemeine Java-Themen 5
N Daten einer JCoTable in JTextArea anzeigen Allgemeine Java-Themen 7
sascha-sphw Java 9 module Zugriff auf eine resource einer anderen JAR Allgemeine Java-Themen 0
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
E Erstellen einer Liste mit einer maximalen Menge an Elementen Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
T Compiler-Fehler NoClassDefFoundError beim Laden einer Class Allgemeine Java-Themen 11
H Klassen LibGDX - Verschiedene Klassen als Value in einer Map Allgemeine Java-Themen 8
P Element einer Liste wurde hinzugefügt, aber es gibt keinen Zugriff Allgemeine Java-Themen 2
E Elemente innerhalb einer ArrayList vergleichen Allgemeine Java-Themen 33
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
temi Java Programm aus einer DB laden und starten Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben