
/**
 * Führt Leistungstests mit verschiedenen Set-Implementationen aus
 * 
 * @author Rainer Helfrich
 * @version November 2020
 */
public class MeinBenchmark extends BenchmarkBase
{
    //# Die Klassen SetVarianteA, SetVarianteB und SetVarianteC sind drei verschiedene Implementationen
    //# des ADTs Set: Mit ArrayList, mit Bitvektor und als Hashtable. 
    //# Sie verhalten sich logisch gleich, zeigen aber verschiedene Eigenschaften in Bezug auf
    //# Laufzeit und Speicherbedarf (vgl. Unterricht).
    //# Konstruieren Sie Testfälle, mit denen man den Unterschied der Implementationsvarianten 
    //# erkennen kann. 
    //# Rufen Sie die Methoden speicherTestAusfuehren bzw. laufzeitTestAusfuehren auf, 
    //# um die Messergebnisse zu sehen.
    
    public void meinTest(int anzahl)
    {
        //# TODO: Konstruieren Sie einen Testfall, um herauszufinden, welche Implementation verwendet wird.
        //#       Der Parameter anzahl entspricht der Variablen anzahl in der Methode speicherTestAusfuehren bzw. laufzeitTestAusfuehren
        //#       Sie können die Methoden des Objekts theSet (ein Set-Objekt) verwenden.
        for (int i = 0; i < anzahl; i++)
        {
            theSet.einfuegen(i);
        }
    }

    /**
     * Führt einen Speichertest mit z.B. 100 Elementen aus und gibt das Ergebnis auf der Konsole aus.
     */
    public static void speicherTestAusfuehren()
    {
        int anzahl = 100;
        String methodenName = "meinTest";
        // Die Variable methodenName muss einer statischen Methode in dieser Klasse entsprechen
        int sizeA = speicherTest("SetVarianteA", methodenName, anzahl);
        int sizeB = speicherTest("SetVarianteB", methodenName, anzahl);
        int sizeC = speicherTest("SetVarianteC", methodenName, anzahl);
        System.out.println(String.format("%d Zahlen; SetVarianteA: %d Bytes; SetVarianteB: %d Bytes; SetVarianteC: %d Bytes",
            anzahl, sizeA, sizeB, sizeC));
    }

    /**
     * Führt einen Laufzeittest mit z.B. 1000 Elementen aus und gibt das Ergebnis auf der Konsole aus.
     */
    public static void laufzeitTestAusfuehren()
    {
        int anzahl = 1000;
        String methodenName = "meinTest";
        // Die Variable methodenName muss einer statischen Methode in dieser Klasse entsprechen
        long timeA = laufzeitTest("SetVarianteA", methodenName, anzahl);
        long timeB = laufzeitTest("SetVarianteB", methodenName, anzahl);
        long timeC = laufzeitTest("SetVarianteC", methodenName, anzahl);
        System.out.println(String.format("%d Zahlen; SetVarianteA: %d µs; SetVarianteB: %d µs; SetVarianteC: %d µs",
            anzahl, timeA, timeB, timeC));
    }
}
