# Zeit stoppen



## flyingthai (31. Okt 2007)

Hallo!

Ich möchte gerne messen wie lange ein Sortieralgorithmus braucht, um eine Menge von Zahlen zu sortieren.

Dafür habe ich System.currentTimeMillis() verwendet.

Ich habe zwei Variablen t1 und t2 vom typ long und zeit vom vom typ int deklariert.

Hier der Code-Auschnitt:


```
t1 = System.currentTimeMillis();
Sortierer1 sort1 = new Sortierer1();  // Algorthmus befindet sich in einer separaten Klasse
sort1.sortiere(z);
t2 = System.currentTimeMillis();
zeit = (int) (t2-t1);
```

Habe ihn jetzt mal 240000 Zahlen sortieren lassen. Dafür braucht er wohl 46 Sekunden.

Meine Frage ist erstens, ob die Zeitmessung richtig ist und zweitens, ob die Messgenauigkeit verbessert werden kann.
Also, dass er die Zeit in Sekunden und Millisekunden angibt. Kann mir da jemand auf die Schnelle weiterhelfen?


----------



## SlaterB (31. Okt 2007)

Messung ist richtig, soweit man bei so grobem Gebastel von richtig und falsch sprechen kann,

Formatierung:
entweder manuell (durch 60 teilen = Minuten usw)
oder ein Date erstellen und SimpleDateFormat nutzen,
nur im Bereich < 24 Stunden zu empfehlen


----------



## flyingthai (31. Okt 2007)

Opps habe mich bezüglich Messgenauigkeit falsch ausgedrückt. Ist es möglich, dass die Zeit mikrosekundengenau gemessen wird?

Die Formatierung ändert ja am Ergebnis nichts.

60sec wären dann 3600msec

Mich würde aber interessieren, ob 60sec nicht vll 61,34sec sind.  :bae: 


Aber wenn die Implementierung schon so richtig ist, dann bin ich vollkommen zufrieden.  :wink:


----------



## SlaterB (31. Okt 2007)

60sec sind 3600msec? naja 


es gibt noch System.nanoTime()
aber generell kann man behaupten, dass die Systemzeit eh nicht so supergenau ist,
außerdem werden Threads unterbrochen, durch andere Aufgaben der Java VM sowie des Betriebssystems,
+- 30ms sollte man immer rechnen, 
aber ganze Sekunden kann man damit gut timen

> Mich würde aber interessieren, ob 60sec nicht vll 61,34sec sind.

millisekundengenau hast du es doch:
60,000 Sekunden ist sicher,

es geht dir ja nur noch um weitere Microsekunden?


----------



## byte (31. Okt 2007)

System.nanoTime() / 1000 = Zeit in Mikrosekunden, oder?


----------



## flyingthai (31. Okt 2007)

Hoppla, da habe ich mich etwas vertan.  :lol: 

1 Sekunde = 1 000 Millisekuden = 1 000 000 Mikrosekunden


Ich glaube ich belasse es einfach bei Sekunden. Die paar Millisekunden machen die Sortieralgorithmen auch nicht schneller.  :wink:


----------



## byte (31. Okt 2007)

Für die Umrechnungsfaulen gibts seit 1.5 die Enum TimeUnit, die alles weitere regelt. Wenn Du also Microsekunden brauchst, dann machst Du einfach:


```
long t0 = System.nanoTime();
...
long t1 = System.nanoTime();
long micros = TimeUnit.NANOSECONDS.toMicros( t0 - t1 );
```


----------

