Für mein Science-Fair-Projekt habe ich eine Optimierung der Sortierroutine von Python implementiert . Die Idee ist, die Sicherheitsüberprüfungen, die bei jedem Vergleich durchgeführt werden müssen, z. B. Typprüfungen und Zeichenbreitenprüfungen, außerhalb der Sortierschleife zu verschieben und sie alle in einem Durchgang durchzuführen. Basierend auf den Ergebnissen der Prüfungen wird dann eine optimierte Vergleichsfunktion aus einem Portfolio ausgewählt. Wenn die Prüfungen beispielsweise feststellen, dass alle Objekte vom gleichen Typ sind, kann die ausgewählte Vergleichsfunktion die normalerweise erforderliche Prüfung "Sind die Objekttypen kompatibel?" Überspringen. Usw.
Ich muss dies als Papier schreiben und arbeite derzeit an einer Literaturübersicht. Gibt es Artikel, die ähnliche Techniken in anderen dynamischen Sprachen / allgemein beschreiben?
quelle
Antworten:
Mir ist so etwas nicht genau bekannt, aber es gibt einige Dinge, die wohl miteinander zusammenhängen.
Für die spezifische Sortierung hängt dies mit der Schwartzschen Transformation zusammen , allerdings mit einem ganz anderen Ziel. In der Schwartzschen Transformation durchlaufen Sie die Eingabe mit einer teuren Funktion, koppeln Eingabe und Ausgabe miteinander und sortieren dann nach der Ausgabe. Dies steht im Gegensatz zur Ausführung dieser teuren Funktion bei jeder Operation. In Ihrem Fall wären Ihre "teuren Funktionen" die Typprüfungen und die dynamischen Versendungen . Ein bisschen anders würden Sie eine Eigenschaft auch für die gesamte Liste überprüfen und dann basierend darauf auswählen, welche Vergleichsoperation verwendet werden soll.
Ganz anders ausgedrückt gibt es eine allgemeine Technik namens polymorphes Inline-Caching ( vom Self-Team entwickelt und unter anderem in der Arbeit von Craig Chamber behandelt ) und eine allgemeinere adaptive Optimierung , die in einigen virtuellen Maschinen verwendet wird. Polymorphes Inline-Caching löst das Problem, dass wir bei einem dynamischen Versand zu einem völlig unbekannten Code springen und ihn daher nicht inline einbinden und ihn und die aktuelle Funktion optimieren können. Die Lösung ist einfach: Führen Sie einfach einen
if
Test durch, um festzustellen, ob wir uns in einem bestimmten Fall befinden. In diesem Fall können wir diesen Code einbinden, andernfalls führen wir den dynamischen Versand durch. Das Problem ist, dass es eine unbegrenzte, unbekannte Anzahl möglicher Fälle gibt. Dies ist jedoch kein Problem für aJust-In-Time (JIT) -Compiler, der dies nur für die zur Laufzeit tatsächlich angezeigten Fälle tun kann.Dies löst Ihr Problem nicht, da der dynamische Versand auf der Laufzeitklasse eines Objekts basiert und nicht auf einem beliebigen Prädikat wie "Alle Elemente dieses Arrays haben denselben Typ". Hier kommt die adaptive Optimierung ins Spiel und Dinge wie die Verfolgung von JIT-Compilern. Es ist durchaus denkbar, dass das mehrmalige Abrollen einer Schleife oder das Inlinen einiger Rekursionsstufen dazu führen kann, dass viele Typprüfungen durch einfache Optimierungen des konstanten Ausbreitungsstils eliminiert werden und in einigen Fällen möglicherweise durch komplexere Optimierungen vollständig eliminiert werden. Trotzdem wird es oft nicht das Gleiche tun, wie Sie es vorschlagen, und es müsste zuerst eine Ablaufverfolgung für jede Verwendung der Sortierfunktion angezeigt werden. Wenn es jedoch weiß, dass alle Elemente Zahlen sind, beispielsweise aus früherem Code, kann die Überprüfung vollständig vermieden werden.
quelle