Ich arbeite an einer Sprache in F # und beim Testen finde ich, dass die Laufzeit über 90% ihrer Zeit im Vergleich zu Gleichheit ausgibt. Deswegen ist die Sprache so langsam, dass sie unbrauchbar ist. Während der Instrumentierung wird die GetHashCode
-Funktion ziemlich weit oben auf der Liste als Overhead-Quelle angezeigt. Was passiert, ist, dass ich während Methodenaufrufen die Methodenkörper (Expr
) zusammen mit den Aufrufargumenten als Schlüssel in einem Wörterbuch verwende und wiederholte Überquerungen über die AST-Segmente auslöst.Wie cache ich Hash-Codes für eine AST?
Um die Leistung zu verbessern, möchte ich Memoknoten im AST hinzufügen.
type Expr =
| Add of Expr * Expr
| Lit of int
| HashNode of int * Expr
In dem obigen vereinfachten Beispiel, was ich möchte, ist, dass die HashNode
den Hash seiner Expr darstellen, so dass die GetHashCode
nicht tiefer in dem AST, um sie zu berechnen reisen muss.
Das gesagt, ich bin mir nicht sicher, wie ich die GetHashCode
Methode überschreiben sollte. Im Idealfall möchte ich die eingebaute Hash-Methode wiederverwenden und sie nur die HashNode
irgendwie ignorieren lassen, aber ich bin nicht sicher, wie man das macht.
Eher wahrscheinlich, ich werde meine eigene Hash-Funktion machen müssen, aber leider weiß ich nichts über Hash-Funktionen, also bin ich jetzt ein bisschen verloren. Eine alternative Idee, die ich habe, wäre, Knoten mit eindeutigen IDs zu ersetzen, während diese Hash-Funktion beibehalten wird, aber das würde zusätzliche Komplexität in den Code einführen, die ich lieber vermeiden würde, wenn es nicht nötig wäre.
Warum müssen Sie für "Gleichheit" vergleichen? F # builtin 'equal' ist langsam, aber einen Baumvergleich zu machen wäre unabhängig davon teuer. Wenn Sie nur für die Objektidentität und nicht für die Gleichheit vergleichen müssen, können Sie das 'CustomEquality' Attribut verwenden. – FuleSnabel
Siehe [meine Antwort] (https://www.reddit.com/r/Compilers/comments/6rrn36/how_to_speed_up_equality_checking/dl8yvgl/?st=j6129dpv&sh=4d371f23) für dragonnixx in [this thread] (https: // www. reddit.com/r/Compiler/Kommentare/6rrn36/how_to_speed_up_equality_checking /). Was ich tue, heißt polyvariante Spezialisierung und ich brauche es, um Rekursion in meiner Sprache zu handhaben. Ich denke ich habe eine Idee wie es jetzt geht. –
Diese Frage scheint ein wenig überall. Was genau fragst du? –