Allgemeines
Oft will man die Zeit erfassen, die ein Algorithmus benötigt, um beispielsweise 10.000 int-Zahlen zu sortieren. Dafür gibt es in Java spezielle Routinen. Eine davon möchte ich an dem folgenden Quelltext demonstrieren.
Quelltext 1
public long analyse() { long start, stop, diff; erzeugen(); Date dStart = new Date(); start = dStart.getTime(); bubblesort(); Date dStop = new Date(); stop = dStop.getTime(); diff = stop - start; System.out.println (MAX + " Zahlen sortiert nach " + diff + " ms"); return diff; }
Bemerkungen zum Quelltext 1
Hier soll erfasst werden, wie viele Millisekunden die Methode bubblesort() benötigt, um eine vorgegebene Anzahl von int-Zahlen zu sortieren.
Dazu wird die Methode getTime() der Klasse Date benutzt. Wichtig ist, dass zwei Date-Objekte erzeugt werden, eines muss direkt vor dem Sortieralgorithmus erzeugt werden, das zweite direkt danach.
Ich habe mal versucht, beide Date-Objekte im Kopf der Methode analyse() zu erzeugen - wie es sich eigentlich für lokale Variablen gehört - das hat aber nicht funktioniert, es wurden dann immer 0 ms angezeigt.
Die Methode Date.getTime() ist relativ grob und hängt von der Systemuhr ab. Für Laufzeitmessungen gibt es eine bessere Methode: System.nanoTime(). Diese Methode misst die Zeit in Nanosekunden und ist nicht von der Systemuhr abhängig.
Quelltext 2
public long analyse() { long start, stop, diffNanos; double diffMillis; erzeugen(); start = System.nanoTime(); bubblesort(); stop = System.nanoTime(); diffNanos = stop - start; diffMillis = diffNanos / 1_000_000.0; System.out.println(MAX + " Zahlen sortiert nach " + diffMillis + " ms"); return diffMillis; }
Bemerkungen zu Quelltext 2
Die Methode System.nanoTime() ist die genaueste Methode zur Zeitmessung für Algorithmen. Hier ein Vergleich von System.currentTimeMillis() und System.nanoTime().
Vergleich von zwei Zeitmess-Methoden
System.currentTimeMillis()
Diese Methode und auch die Methode Date.getTime() geben die aktuelle Uhrzeit seit dem 1. Januar 1970 in Millisekunden zurück. Die Methode basiert auf der Systemuhr, die vom Betriebssystem gepflegt wird. Leider ist die Systemuhr nicht allzu zuverlässig, sie kann springen, manuell verstellt werden, sich von Sommer- auf Winterzeit umstellen etc. Für grobe Zeitmessungen im Sekundenbereich kann man die Methode ohne Probleme verwenden, aber nicht für zeitkritische Messungen von Algorithmen.
System.nanoTime()
Diese Methode ist wesentlich genauer als System.currentTime() oder Date.getTime(), sie liefert die Zeit in Nanosekunden zurück. Diese Zeitmessung basiert auf hochauflösenden Hardware-Zählern, zum Beispiel den Taktzähler des Prozessors. System.nanoTime() ist nicht von der Systemuhr abhängig. Auch wenn diese nachgestellt wird, läuft System.nanoTime() unbeeinflusst weiter. Allerdings liefert diese Methode eine absolute Zeit in Stunden, Minuten und Sekunden zurück, sondern nur einen sehr langen int-Wert (Datentyp long). Das ist aber egal, da man bei der Zeitmessung von Algorithmen immer mit einer Zeit-Differenz rechnet und nicht mit absoluten Zeiten.