# Laufzeit in Nanosekunden - in Minuten umrechnen



## NanoMan89 (10. Mai 2010)

Hallo,

ich habe eine Schleife die solange läuft, bis ich sie manuell abbreche.
Vor Beginn der Schleife setze ich die Startzeit mit:

```
final long startZeit = System.nanoTime();
```
und nach manuellem Abbruch der Schleife setze ich die Stopzeit mit:

```
final long stopZeit = System.nanoTime();
```

Danach möchte ich die Zeit zwischen startZeit und stopZeit in Minuten ausgeben. Die Minuten Berechne ich mit folgender Formel:

```
final double d = ((stopZeit - startZeit) * ((10 / 6) * (1 / (1000000 * 100000))));
```
und runde das Ergebnis auf keine Nachkommastellen:

```
final int dauer = (int) d;
```

Als Vergleich starte ich eine Stoppuhr. Die ausgegebene Dauer jedoch ist immer unterschiedlich geringer, als die tatsächliche Dauer, und das um mehrere Minuten. Eigentlich müsste die Differenz doch maximal 1, von mir aus auch 2 Minuten betragen. Aber sie beträgt bei tatsächlicher Dauer von 13 Minuten beispielsweise, nur 4 Minuten.

Wüsste jemand woran das liegen könnte? Vielleicht wenn ich das double auf Integer caste?


----------



## Gast2 (10. Mai 2010)

*schwachfug*

Edit:
*nochmehr davon*

Edit2:
Das sollte es sein:

```
final double d = (stopZeit - startZeit) * ((1.0 / 6) * Math.pow(10, -10));
```
Warum du bei z.b. nur 13 Minuten Laufzeit einfach die Sekunden abschneidest weiß ich nicht. Da hast du (bei 13min) im schlimmsten Fall nen Fehler von 7.5% zur tatsächlichen Zeit drin.


----------



## NanoMan89 (10. Mai 2010)

Die Sekunden brauche ich nicht, +- 1 Minute reicht mir, da die Schleife mehrere Stunden laufen soll, und die Sekunden sind da nicht relevant.
Damit:

```
final double d = (stopZeit - startZeit) * ((1.0 / 6) * Math.pow(10, -10));
```
funktioniert es richtig, dein Beispiel davor hat nicht richtig funktioniert. Bei Abbruch nach wenigen Minuten hat er mir 276Minuten angezeigt.

Statt auf int zu casten, belasse ich es bei double, und runde die Zahl auf eine Ganzzahl:

```
final long dauer = Math.round(d);
```

Dein vorheriges Beispiel umgeändert auf:

```
double d = ((stopZeit - startZeit) * ((10.0 / 6.0) * (1.0 / (1000000.0 * 100000.0))));
```
 funktioniert übrigens auch...

DANKE für deine Hilfe.


----------



## Michael... (11. Mai 2010)

Wenn Dich nur die Minuten interessieren, warum erfragst Du dann die nanoTime?
Und warum rechnest Du dann mit double, wenn Dir eine Genauigkeit von +/- 1 Minute ausreicht?


```
long start = System.currentTimeMillis();
...
long ende = System.currentTimeMillis();
long dauer = (ende - start)/60000;
```


----------



## tanye (2. Jan 2012)

Wieso funktioniert das denn bei mir nicht ? -.- 


```
public static int binomial (int n, int k){
	
	final long startZeit = System.nanoTime();


	
		           if (k==0) {
		             	return 1;
	                         	}
		           else if (n==k){
		             	return 1;
	                            	}
		else  {
			return	binomial(n-1, k -1) + binomial(n-1,k); 
				    }
	   
	
	final long EndZeit = System.currentTimeMillis()-startZeit;

	}
```
bei "Endzeit" wird mir nur "Remove" angeboten .... Was ist denn daran falsch ich seh es nicht ;(


----------



## bygones (2. Jan 2012)

dein EndZeit wird nie erreicht, da die methode vorher mit return verlassen wird.

eine zeitmessung bei rekursiven Methoden ist sinnvoller in die aufrufende Methode zu packen


----------



## SlaterB (2. Jan 2012)

System.currentTimeMillis()-startZeit = milliTime - nanoTime ist sowieso unsinnig


----------

