next up previous contents
Next: Deoptimierung Up: Techniken zur Programmausführung Previous: Diskussion   Inhalt


Erhebung von Laufzeitprofilen

Dynamische Optimierungen sind auf Informationen über das Laufzeitprofil angewiesen. Insbesondere drei Entscheidungen müssen unterstützt werden:

Welche Informationen müssen also erhoben werden, um genannte Entscheidungen treffen zu können, und auf welche Weise ist dies möglich?

Zunächst lassen sich maß- und stichprobenbasierte Methoden unterscheiden. Erstere erstellen ein genaues Profil, indem sie jede relevante Programmoperation im Profil festhalten. Dies kann durch Aufrufzähler und Zeitmessung jeder Methodenausführung geschehen. Die Erhebung von Stichproben (sampling), verfolgt einen statistischen Ansatz: eine Methode, die sich in p % aller Stichproben in Ausführung befindet, wird auch diesen Anteil an der Programmlaufzeit einnehmen3.2. Laut [Arnold et al., 2000c] erreichen stichprobenbasierte Methoden auch für kurzlebige Programme ausreichende Aussagekraft.

Gemäß Abschnitt 3.1 stellt der Anteil p einen guten Indikator für Übersetzungskandidaten dar; Aufrufzähler geben ein ungenaueres Bild, Zeitmessungen erscheinen dagegen relativ aufwendig. Zur Ermittlung der hot spots eines Programms bieten sich folglich Stichproben an.

Ein Typtest an einer Aufrufstelle eignet sich nur, wenn der Empfänger in der überwiegenden Zahl der Fälle den getesteten Typ aufweist. Um einen geeigneten Kandidaten zu ermitteln, muß also die Verteilung der Empfängertypen an einer Aufrufstelle erhoben werden. Auch dies ist mit direkter Messung möglich: an die Aufrufstelle wird ein Aufrufzähler eingebettet, der die Vorkommen einer kleine Anzahl von Empfängertypen zählt. Geschieht dies durch direkte Einbettung einer kaskadierten Testsequenz in den Code, so wird als Nebeneffekt bereits eine Beschleunigung des Aufrufs erzielt. Der auf diese Weise realisierte polymorphic inline cache(PIC) [Hölzle et al., 1991] dient also gleichzeitig der Optimierung als auch der Profilerstellung.

Die Erhebung von Typverteilungen auf statistischem Wege gestaltet sich komplizierter: beim mehrfacher Beobachtung desselben (Aufrufer, Ziel)-Paares ist nicht einfach entscheidbar, ob es sich um unterschiedliche Aufrufe handelt, oder ob dieselbe -- langlebige -- Aktivierung beobachtet wurde. Aus diesem Grund kann nur ein Instruktionszeiger, der im Prolog der Zielmethode erhoben wird, als Indiz für eine neuerliche Aktivierung betrachtet werden; der Prolog wird mit ausreichender Wahrscheinlichkeit innerhalb des Stichproben-Intervalls linear durchlaufen und kann somit nicht zweimal erhoben werden. Es besteht nunmehr allerdings die Gefahr, daß die kurzen Methodenprologe zu klein sind, um in ausreichendem Maße stichprobenrelevant getestet werden zu können. In diesem Zusammenhang erweist sich eine vom Programmpunkt abhängige Unterbrechungsstrategie wie die der Jalapeño-VM (siehe 5.3.1) von Vorteil. Stichproben werden hier nämlich jeweils an Unterbrechungspunkten (s. Abschnitt 2.3.4 und 5.3) entnommen. Da Threads ausschließlich in Methodenprologen und an Rückwärtssprüngen in Schleifen unterbrochen werden, erhöht dies die statistische Aussagekraft der Aufrufverteilungen in erheblichem Maße.

Nach Untersuchungen von [Arnold et al., 2000a] arbeiten Heuristiken zur Methodenintegration am erfolgreichsten, wenn das Aufrufprofil Aufrufe nach ihrem Aufrufer aufschlüsselt. An unterschiedlichen Aufruforten ist die Integration einer bestimmten Methode mehr oder weniger sinnvoll; die Profildaten helfen hier, Integrationskandidaten gegeneinander abzuwägen.

Mehrere virtuelle Maschinen arbeiten mit profilgesteuerten Optimierungen. Die Self-VM [Sun Microsystems, 2000b] enthält Methodenzähler und polymorphic inline caches, die vom optimierenden Compiler ausgewertet werden. Die Jalapeño-VM enthält eine Profildatenbank, die durch regelmäßige Stichproben an Unterbrechungspunkten gefüllt wird. Swift [Scales et al., 2000], der optimierende Compiler der virtuellen Java-Maschine für die Alpha-Architektur von Compaq, bedient sich der Profil-Infrastruktur DCPI [Anderson et al., 1997], die vom Betriebssystem und dem Prozessor zur Verfügung gestellt werden.


next up previous contents
Next: Deoptimierung Up: Techniken zur Programmausführung Previous: Diskussion   Inhalt

2001-02-28