Ich habe eine A*-Suchalgorithmus für die Suche nach einem kürzeste Weg zwischen zwei Zuständen. Der Algorithmus verwendet eine Hash-Map zur Speicherung der besten bekannten Entfernungen für besuchte Zustände. Und eine Hash-Map für die Speicherung von Kind-Eltern-Beziehungen, die für die Rekonstruktion des kürzesten Pfades benötigt werden.
Hier ist der Code. Die Implementierung des Algorithmus ist generisch (die Zustände müssen nur "hashable" und "comparable" sein), aber in diesem speziellen Fall sind die Zustände Paare (Vektoren) von ints [x y]
und sie stellen eine Zelle in einer bestimmten Höhenkarte dar ( Kosten für den Sprung zu Nachbarzelle hängt von der Höhendifferenz ab).
Die Frage ist, ob es möglich ist, die Leistung zu verbessern und wie? Vielleicht durch die Verwendung einiger Funktionen aus 1.2 oder zukünftigen Versionen, durch eine Änderung der Logik der Algorithmus-Implementierung (z.B. durch eine andere Art der Pfadspeicherung) oder eine Änderung der Zustandsdarstellung in diesem speziellen Fall?
Java-Implementierung läuft im Handumdrehen für diese Karte und die Clojure-Implementierung dauert etwa 40 Sekunden. Natürlich gibt es dafür einige natürliche und offensichtliche Gründe: dynamische Typisierung, persistente Datenstrukturen, unnötiges (Un-)Boxing von primitiven Typen...
Die Verwendung von Transienten hat keinen großen Unterschied gemacht.