Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
/** * Entfernt alle nicht konsistenten Codes aus der Liste * @param last Der zu vergleichende Tipp * @param blacks Anzahl schwarzer Pins * @param whites Anzahl weißer Pins */ private void removeWrongCodes(final Guess last, final int blacks, final int whites) { Thread thread = new Thread() { @Override public void run() { long start = Calendar.getInstance().getTimeInMillis(); CompareResult comparison = null; for (Guess temp : possibilities) { comparison = new CompareResult(temp, last.ReturnGuessAsResult()); if (comparison.Blacks() == blacks && comparison.Whites() == whites) { remaining.add(temp); } comparison = null; } possibilities.retainAll(remaining); remaining.clear(); long end = Calendar.getInstance().getTimeInMillis(); System.out.println((end - start) + " ms - new Size: " + possibilities.size()); }; }; thread.start(); } |
Also ich weiß ja nicht, wie gut der Java Compiler und die VM mittlerweile optimiert, aber ohne optimierung ist es ziemlich tödlich, aber das erstellen neuer Objekte könnte einen nicht unerheblichen Zeitaufwand bedeuten. Es muss eventuell eine leere Stelle im Speicher gefunden werden, das Objekt wird initialisiert und alle paar Durchläufe muss der Garbage Collector wieder aufräumen. Ich habe gehört, dass mittlerweile recht gut optimiert wird, aber vielleicht wäre es ja einen Versuch wert.
Dann gibt es vielleicht auch die Möglichkeit, Elemente aus dem Guess Container zu löschen, während du über ihn iterierst. retainAll muss im unsortierten Fall jedes Objekt von remaining suchen, was irgendwie der Laufzeit von n*log(n) (für jedes Objekt eine Suche) entspricht. Wenn CompareResult nicht vollkommen verrückte Dinge macht, könnte dass die Laufzeit mehr als halbieren.
Aber Java zu optimieren, hört sich auch irgendwie schon komisch an. Rein von Prinzip her, könnte die selbe Implementierung in C++ locker 20 mal schneller laufen (weil es wirklcih sehr low Level ist), aber da weiß ich wieder nicht genau, wie viel Optimiert wird - im Hintergrund passieren da viele Komplexe Dinge.
Wenn das nichts hilft, wirst du wohl einen neuen Algorithmus und vermutlich eine neue Datenstruktur brauchen. Das effizient zu berechnen ist sicherlich ein sehr interessantes Problem.
Aber versuch erstmal, das retainAll los zu werden.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Affje« (03.01.2012, 10:22)
Java-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// Verwende die Klasse HashSet statt einer Liste import java.util.Arrays; class Guess { private int array[]; // ... public int hashCode() { return Arrays.hashCode(array); } // keine CompareResult-Klasse sondern hier vergleichen public boolean equals(Object o) { if(! o instanceof Guess) return false; return Arrays.equals(array, ((Guess)o).array); } } |
Den C/C++ Kompiler möchte ich mal sehen der so viel Performance herausholen kann. Vorallem wenn man viele kleine Objekte anlegt, und schnell wieder wegwirft,Aber Java zu optimieren, hört sich auch irgendwie schon komisch an. Rein von Prinzip her, könnte die selbe Implementierung in C++ locker 20 mal schneller laufen (weil es wirklcih sehr low Level ist), aber da weiß ich wieder nicht genau, wie viel Optimiert wird - im Hintergrund passieren da viele Komplexe Dinge.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »foreach« (03.01.2012, 12:31)
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Na ja, aber in C++ würde man dann solche Objekte ja eher auf dem Stack erzeugen, was deulich schneller ist als auf dem Heap bzw. als bei Java mit new.Den C/C++ Kompiler möchte ich mal sehen der so viel Performance herausholen kann. Vorallem wenn man viele kleine Objekte anlegt, und schnell wieder wegwirft,Aber Java zu optimieren, hört sich auch irgendwie schon komisch an. Rein von Prinzip her, könnte die selbe Implementierung in C++ locker 20 mal schneller laufen (weil es wirklcih sehr low Level ist), aber da weiß ich wieder nicht genau, wie viel Optimiert wird - im Hintergrund passieren da viele Komplexe Dinge.
ist java häufig wesentlich effizienter als wenn man das gleiche mit malloc() und free() machen würde.
Na ja, aber in C++ würde man dann solche Objekte ja eher auf dem Stack erzeugen, was deulich schneller ist als auf dem Heap bzw. als bei Java mit new.
Werbeanzeige