Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: "Christian H. Kuhn" Newsgroups: de.comp.lang.java Subject: Re: Rekursion bricht nicht ab Date: Thu, 14 Apr 2016 09:20:39 +0200 Lines: 33 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: individual.net wx5CoHMEl6SVf3dHAwYjMgqtogsodgadmD5H0vGC+eHvvz3T8= Cancel-Lock: sha1:FSmHebf/qAeC01iqEQY5mXJ0AYM= User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 In-Reply-To: Xref: csiph.com de.comp.lang.java:12936 Am 14.04.2016 um 00:42 schrieb Christian H. Kuhn: > Am 13.04.2016 um 19:25 schrieb Wanja Gayk: >> Der Overhead vom Exceptionhandling ist jedenfalls in 99.9999999999999% >> aller Fälle kein Problem. > > Ich habe visualvm dann mal eingesetzt. Mann, habe ich gelacht. Je > nachdem, ob ich dem Profiler oder dem Sampler glaube, verbringe ich > 65–95% der Rechenzeit im Konstruktor von drei verschiedenen Exceptions, > wobei zwei etwa gleich viel Zeit brauchen und die dritte ein Viertel > davon. Und es sieht so aus, dass es tatsächlich die Aufrufe sind und > weder super(String) noch die Erstellung des String. > > Die Exceptions werden bei der Überprüfung eines Zugs auf Legalität > geworfen. Das betrifft hauptsächlich Züge in ein volles Glas und Züge > auf einen Platz mit falschfarbigem Untermann, z.T. auch Züge mit > gleichem Start und Ziel. Hm. Mal schauen, was sich da in der > Zuggenerierung abfangen lässt. Gigantisch. Alte Version: getMoveList() erzeugt die Liste der erlaubten Züge, indem alle denkbaren Züge erzeugt und mit isLegalMove() überprüft werden; in isLegalMove() werden dann die ganzen Exceptions geworfen. Die erste Stellung aus Level 4 braucht dann 2270765 ms. Stattdessen: Einhaltung der Größengrenzen ist durch die verschachtelten Schleifen garantiert; die übrigen Fehlermöglichkeiten stehen als if (x || y || z) { continue; } drin. Reduktion auf 98558 ms. Ich bin begeistert. Jetzt kommt noch der letzte Optimierungsschritt: Ich mache eigentlich keine Breitensuche, sondern eine definiert abbrechende Tiefensuche. Mal schauen, was ich da noch rauskitzle. lg QNo