# Laufzeit bei rekursiver Methode messen



## Sesostris (7. Mrz 2012)

Hallo,

folgendes Beispiel für eine typisch rekursive Funktion: die Fibonacci-Folge

```
public class Recursive {
    public long fibonacci(int n) {
    	if (n == 0) return 0;
    	if (n == 1) return 1;
    	return fibonacci(n-1)+fibonacci(n-2);
    }
}
```

Laut meiner Vorgabe sollte es eine Instanzvariable runtime geben, die die Laufzeit in Millisekunden der zuletzt ausgeführten Methode speichert.


```
public class Recursive {
    public long runtime;

    public long fibonacci(int n) {
    	runtime = System.currentTimeMillis();
    	long fibonacci2 = fibonacci2(n);
    	runtime = System.currentTimeMillis() - runtime;
    	return fibonacci2;
    }

    private long fibonacci2(int n) {
    	if (n == 0) return 0;
    	if (n == 1) return 1;
    	return fibonacci2(n-1)+fibonacci2(n-2);
    }
}
```

Ginge das auch irgendwie eleganter?


----------



## Fab1 (7. Mrz 2012)

Hallo,


schau mal hier unter Java: 

Performance-Messung - Wissensbasis

sicherlich sehr hilfreich.



> Quelle: Performance-Messung - Wissensbasis
> 
> 
> Zeitmessung mit System.currentTimeMillis():
> ...


----------



## Sesostris (7. Mrz 2012)

Aber das ändert nichts daran, dass die Messung der Laufzeit so unelegant in zwei Methoden aufgeteilt ist. 
Trotzdem danke für den Tipp; ich habe es abgeändert.


----------



## Gast2 (7. Mrz 2012)

ne zweite Methode brauchst du ja nicht unbedingt. Du kannst die Zeitmessung auch in der aufrufenden Klasse machen.


----------



## Sesostris (7. Mrz 2012)

Du meinst so?

```
Recursive foo = new Recursive();
foo.runtime = System.nanoTime();
long fibonacci = foo.fibonacci(50);
foo.runtime = System.nanoTime() - foo.runtime;
```

Aber angenommen, ich rufe foo.fibonacci(...) mehrmals auf und will immer die letzte Laufzeit wissen, dann müsste ich ebenfalls mehrmal dieses Gerüst foo.runtime = ... usw. schreiben. Genau das wollte ich mir ja sparen, indem ich die Laufzeitmessung mit ins Objekt packe.


----------



## Gast2 (7. Mrz 2012)

> dann müsste ich ebenfalls mehrmal dieses Gerüst foo.runtime = ... usw. schreiben


...oder das ganze in ne Schleife packen.


----------



## nillehammer (7. Mrz 2012)

Du könntest fibonaci so umschreiben, dass sie ein Array mit zwei long-Elementen returnt. Das erste ist das eigentliche Ergebnis, das zweite die Laufzeit. Über die Eleganz lässt sich streiten, aber so kommst Du ohne Instanzvariable und ohne externe Zeitmessung aus.


----------

