PräambelWas sind die verschiedenen Techniken sind megamorphic Aufrufstellen effizienter
Dies ist, um über die Verbesserung der Effizienz Nachricht in einem JIT-Compiler senden. Trotz der Bezugnahme auf Smalltalk gilt diese Frage für die meisten dynamischen JIT-kompilierten Sprachen.
Problem
eine Nachricht senden Website gegeben, kann es als monomorphic, polymorph oder megamorphic klassifiziert werden. Wenn der Empfänger der Nachricht send immer vom gleichen Typ ist, ist es eine monomorphe senden, wie in
10 timesRepeat: [Object new].
wo der Empfänger von new
ist immer Object
. Für diese Art von Sends emittieren JITs monomorphe Inline-Caches.
Manchmal eine gegebene Sende Website ein paar verschiedene Objekttypen bezieht, wie:
#(1 'a string' 1.5) do: [:element | element print]
In diesem Fall wird print
auf verschiedene Arten von Objekten gesendet. In diesen Fällen geben JITs normalerweise polymorphe Inline-Caches aus.
Megamorphe Nachrichten gesendet werden, wenn eine Nachricht an nicht nur ein paar, sondern eine Menge von verschiedenen Objekttypen an einem Ort gesendet wird. Eines der prominentesten Beispiele ist dieses: Hier
Behavior>>#new
^self basicNew initialize
, basicNew
erstellt das Objekt, dann initialize
Initialisierung der Fall ist. Sie könnten tun:
Object new
OrderedCollection new
Dictionary new
und sie werden alle das gleiche Verhalten ausführen >> # neue Methode. Da die Implementierung von initialize in vielen Klassen unterschiedlich ist, wird der PIC schnell gefüllt. Ich interessiere mich für diese Art von Sende-Sites, wissend, dass sie nur selten auftreten (nur 1% der Sends sind megamorph).
Frage
Was sind die möglichen und spezifischen Optimierungen für megamorphic Sende Websites machen einen Nachschlag zu vermeiden?
Was megamorphic Selektoren (wie #initialize) an speziellen Stellen an den Empfänger MethodDictionary, so kurzzuschließen Förderung ihres Sieh nach oben? –
Was wären diese besonderen Orte? und wie konnten sie an das MethodDictionary des Empfängers angehängt werden? – melkyades
Ich weiß es nicht genau. Aber hey, Wörterbücher bieten viele Möglichkeiten, Dinge an sie anzuhängen! Zum Beispiel würde ich in Erwägung ziehen, eine Verbindung zu der MD mit einem reservierten Schlüssel (z. B. einem SmallInteger) hinzuzufügen und dort die megamorphe Methode zu kopieren. Da alle Selektoren Symbole (und nicht SmallIntegers) sind, wird es keine Kollisionen mit "normalen" Nachrichten geben. Aber auch das ist nur eine Idee, die mehr Nachdenken und Experimentieren erfordert. –