2015-03-12 10 views
8

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?

Antwort

3

Ich stelle mir ein paar vor und möchte mehr wissen. Nach einem PIC voll ist, werden wir die Nachschlag rufen müssen (es voll ist oder die globale gecached eins ist), aber wir können optimieren:

  • Bereiten Sie die PIC, alle Einträge Wegwerfen (viele Einträge sein könnte alt und nicht häufig benutzt).
  • Rufen Sie eine bestimmte megamorphe Suche auf (d. H. Eine, die alle zuvor versendeten Typen in einem Array zwischenspeichert, das durch den Hash-Typ unterstützt wird).
  • Inline das enthält Verfahren (bei inlined kann die Sendestelle ist megamorphic stop)
+0

Was megamorphic Selektoren (wie #initialize) an speziellen Stellen an den Empfänger MethodDictionary, so kurzzuschließen Förderung ihres Sieh nach oben? –

+0

Was wären diese besonderen Orte? und wie konnten sie an das MethodDictionary des Empfängers angehängt werden? – melkyades

+1

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. –

Verwandte Themen