Laufzeitmessungen mit Java sind ganz einfach:
long start = System.nanoTime(); tueEtwasDasLangeDauert(); double runTimeInMilliSeconds = (System.nanoTime() - start) / 1000000d; println("Das hat " + runTimeInMilliSeconds + "ms gedauert!);
Hier muss nur noch statt tueEtwasDasLangeDauert();
das Programm eingefügt werden, dessen Laufzeit ermittelt werden soll.
Wenn man beispielsweise die Laufzeit einer Implementierung von SelectionSort ermitteln möchte, dann lässt sich mit dem oben beschriebenen Anweisungsmuster so realisieren:
int[] sortiere(int[] liste) { for (int bereichsGrenze = 0; bereichsGrenze < liste.length; bereichsGrenze++) { int kleinstes = bereichsGrenze; for (int i = bereichsGrenze; i < liste.length; i++) { if (liste[i] < liste[kleinstes]) { kleinstes = i; } } int tmp = liste[bereichsGrenze]; liste[bereichsGrenze] = liste[kleinstes]; liste[kleinstes] = tmp; } return liste; } void printArray2(int[] array) { for (int i = 0; i < array.length; i++) { print(array[i]); if (i < array.length - 1) { print(", "); } } println(); } void setup() { int[] liste = { 25, 17, 32, 56, 25, 19, 8, 66, 29, 6, 20, 29 }; print("unsortiert: "); printArray2(liste); print("sortieren: "); long start = System.nanoTime(); liste = sortiere(liste); double runTime = (System.nanoTime() - start) / 1000000d; println(runTime + "ms"); print("sortiert: "); printArray2(liste); }
Verwende eine Implementierung des Selection-Sort und das oben gezeigte Anweisungsmuster für verschiedene Laufzeitmessungen (denke dir eigene, unsortierte Arrays aus).
Lege eine Tabelle an:
Länge des Arrays | Durchschnittliche Laufzeit |
---|---|
100 | 0.012123ms |
… | … |
Wie stabil sind die Ergebnisse von Laufzeitmessungen, wenn man ein und dieselbe Liste mehrfach mit demselben Programm sortiert? Wir probieren das mit dem folgenden Testprogramm aus.
int[] array = new int[1000]; for (int j = 0; j < array.length; j++) { array[j] = (int)random(0, array.length); } for (int i = 0; i < 1000; i++) { long start = System.nanoTime(); sortiere(array.clone()); double runTime = (System.nanoTime() - start) / 1000000d; println("Laufzeit: " + runTime + "ms"); }
Wir könnten folgende Ausgabe erhalten:
laufzeit: 0.184849ms laufzeit: 0.184839ms laufzeit: 0.190099ms laufzeit: 0.1848ms laufzeit: 0.18484ms laufzeit: 0.184819ms ...
- Die Messergebnisse schwanken etwas. Was könnte die Ursache hierfür sein?
- Teste, ob du dieselben Zahlenwerte erhältst. Warum kann es sein, dass deine Messwerte in einem anderen Zahlenbereich liegen?
- Die folgenden Messwerte wurden bestimmt, während ein weiterer Prozess auf dem Rechner gestartet wurde. Woran erkennt man das? Auf welche Problematik deutet das hin?
Laufzeit: 1.882562ms Laufzeit: 1.882464ms Laufzeit: 1.882362ms Laufzeit: 1.882561ms Laufzeit: 1.882258ms Laufzeit: 1.882162ms ...