Hinweise zur dynamischen Optimierung von eigenen Funktionen und Modulen

Dynamische Optimierung heißt Optimierung über Modulgrenzen hinweg. Zu diesem Zweck muß der Optimierer über Informationen über alle von der zu optimierenden Funktion verwendeten (insbesondere modulfremden) Objekte verfügen. Dieses ist frühestens zum Link-Zeitpunkt, d.h. nach Compilieren und Importieren aller benötigten Module.

Um eine globale Sicht auf den zu optimierenden Kode zu ermöglichen, besitzt Tycoon die reflektive Eigenschaft, einmal übersetzten und im Store abgelegten Kode in die Zwischenrepräsentation TML (wo der Optimierer arbeitet) zurück zu transformieren. Dazu wird jedoch nicht der ausführbare Byte-Kode, sondern der s.g. PTML-Kode verwendet, der eine persistente Abbildung vom TML-Kode darstellt. Um Platz zu sparen wird PTML-Kode optional bei der Kode-Generierung erzeugt (die Umgebungsvariable generatePTML ist auf false gesetzt).

Folgende Regeln ergeben sich daraus:

  1. Vergewisserung, daß alle von dem zu optimierenden Objekt verwendeten Module und Funktionen mit
      do set generatePTML true
    compiliert wurden. Wenn das bei manchen Objekten nicht der Fall ist, bekommt der Optimierer keine Information, also tastet er solche Objekte nicht an. Das Ergebnis ist eine "partielle" Optimierung nur dieser Objekte, die PTML-Kode haben.
  2. Aufruf der Funktion
      reflect.optimize()
    Sinnvolle Objekte sind Funktionen, aber auch Tupel oder ganze Module. In beiden Fällen werden alle erreichbaren Objekte in der Tiefe transitiv optimiert. Ein wiederholter Aufruf von reflect.optimize erzeugt keinen besseren Kode, vielmehr sollte dazu an den Umgebungsvariablen expandTuningPos, expandTuningPos und expandTuningNeg gedreht werden. Die Voreinstellung sollte jedoch gute Resultate liefern.
  3. Eine Bindung der Form:
       let opt = reflect.optimize(f)
    
    hat keinen Sinn, da das alte Objekt f mit der optimierten Version überschrieben wird. Also sind f und opt gleich:
      f == opt 
    => true
    
  4. Durch die Funktion
      reflect.optimizeXFile()
    
    kann man das x-File eines ausführbaren Moduls (mit Interface Main) dynamisch optimieren. Das Ergebnis ist das selbe File mit optimiertem und kleinerem Kode. Die Voraussetzung ist auch hier, daß das jeweilige Modul mit PTML-Kode-Generierng erzeugt wurde.
  5. Die Umgebungsvariable optimizeTML schaltet lediglich die statische Optimierung (während der Kompilation) ein. Wegen der modularisierten Struktur vom Tycoon-System ist der kode-verbessernde Effekt dieser Optimierung sehr gering, so daß vom Gebrauch abzuraten ist. Diese Alternative wurde jedoch zu Test-und Demonstrationszwecken beibehalten.

Plamen Kiradjiev (30-MAY-1994)