Der Performance auf der Spur – Teil 2 (Projektbeschreibung)

Herzstück des Beispielprojekts ist eine Klasse namens „Calculator“. Diese führt Berechnungen auf Interfaces durch. Das Interface hat entweder eine Implementierung (für den monomorphen Fall), zwei (bimorph) oder 3 (trimorph oder megamorph).

Der Code von Calculator:

package net.modellierung;

public class Calculator {

    public long add(Monomorph m1, Monomorph m2) {
        return m1.getValue() + m2.getValue();
    }

    public long add(Bimorph b1, Bimorph b2) {
        return b1.getValue() + b2.getValue();
    }

    public long add(Trimorph t1, Trimorph t2) {
        return t1.getValue() + t2.getValue();
    }
}

Die Klassen des Projekts – Interfaces mit einer bestimmten Anzahl von Implementierungen:

Klassendiagramm Performanceprojekt

Die Implementierungen der Interfaces besitzen einen Konstruktor mit einem Long-Parameter. Dieser Wert wird beim Aufruf von getValue() zurückgegeben.

Erwartetes Verhalten des JIT-Compilers ist, dass er im ersten Fall Code generieren kann, der auf die eine Implementierung zugeschnitten ist, und damit den teuren virtuellen Methodenaufruf umgeht. Trotzdem müssen in diesem Fall Instruktionen zur Absicherung des Typs generiert werden, da zur Laufzeit eine weitere Implementierung nachgeladen werden kann. Der kompilierte Code muss das merken und dann eine Deoptimierung durchführen (also wieder den Bytecode ausführen und ggf. neuen Code (der beide Implementierungen berücksichtigt) generieren.
Im zweiten Fall weiß der JIT-Compiler, dass es zwei Implementierungen gibt. Der generierte Code kann aber mit einem Typcheck beide Implementierungen unterscheiden und somit auch den virtuellen Aufruf sparen. Auch hier muss der generierte Code Logik enthalten, um ggf. nachgeladene Implementierungen zu berücksichtigen.
Der dritte Fall soll hingegen nicht optimierbar sein, es müssen also virtuelle Aufrufe stattfinden.

Richard Warburton hat bereits mit einer etwas anderen Fragestellung einen interessanten Artikel geschrieben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.