pp.07.02.Collections

Experimenteller Vergleich von Container-Varianten

  • Projekt: pp.07.02.Collections
  • Bearbeitungszeit: 30 Minuten
  • Musterlösung: 30 Minuten
  • Kompatibilität: mindestens Java SE 10

Quellcode von pp.ExperimentVector

package pp;

import java.util.Vector;

class ExperimentVector {
    Integer countA;
    Integer countB;
    Vector<Integer> list;

    void work(int size) throws InterruptedException {
        this.countA = 0;
        this.countB = 0;
        this.list = new Vector<>();
        var t1 = new Thread(() -> {
            for (var i = 0; i < size; i++) {
                this.list.add(1);
            }
        });
        var t2 = new Thread(() -> {
            for (var i = 0; i < size; i++) {
                this.list.add(1);
            }
        });
        var t3 = new Thread(() -> {
            for (var i = 0; i < (size * 2); i++) {
                this.countA += this.list.get(i);
            }
        });
        var t4 = new Thread(() -> {
            for (var i = (size * 2) - 1; i >= 0; i--) {
                this.countB += this.list.get(i);
            }
        });
        var now = System.currentTimeMillis();
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        t3.start();
        t4.start();
        t3.join();
        t4.join();
        System.out.printf("Lauf %s, i=%d, Zeitdauer: %dms (%s)\n",
                (this.countA.equals(this.countB)) ? "ok" : "fehlerhaft", size,
                System.currentTimeMillis() - now, "Vector");
    }

}

Die Klasse ExperimentVector stellt die Methode work bereit. Sie bekommt als Parameter eine int-Zahl, die die Größe der Aufgabe charakterisiert. In dieser Methode werden vier Threads erzeugt, die alle konkurrierend auf die Container-Datenstruktur list zugreifen. Zwei greifen lesend darauf zu, zwei ändern sie, indem Elemente hinzugefügt werden. Der Container ist in dieser Klasse vom Typ Vector.

Insgesamt wird die Laufzeit gemessen, die zur Abarbeitung der Aufgabe benötigt wird. Außerdem wird geprüft, ob ein erwarteter Wert erreicht wird, von dem man annehmen kann, dass er bei einer nicht threadsicheren Implementierung mit hoher Wahrscheinlichkeit eine fehlerhafte Größe haben wird.

Aufgaben

  • Erstellen Sie ein Programm, mit dem Sie die Performanz unterschiedlicher Listeninplementierungen messen können.
    • unabhängige Variablen: Größe der Aufgabe (z.B. Länge der Liste), Listenimplementierung
    • abhängige Variable: Laufzeit
  • Berücksichtigen Sie Threadsicherheit und verwenden Sie mindestens zwei Threads, die nebenläufig auf die Liste zugreifen. Sie können sich am Design von work in der vorgegebenen Klasse ExperimentVector orientieren.
  • Führen Sie Messungen der Laufzeit durch.
  • Visualisieren Sie die Ergebnisse und analysiseren Sie das Ergebnis.