# Laufzeit messen



## WebOlli (4. Mai 2004)

Ich würde für ein kleines Java-Programm gerne die Laufzeit in Sekunden messen, habe aber keine Ahnung, wie ich das anstellen soll.
Das Prog erzeugt Felder mit zufälligen Zahlen und sortiert diese dann mit verschiedenen Algorithmen und ich würde gerne eine Ausgabe haben, wie lange dies dauert...
Kann mir jemand nen Tipp geben?


----------



## oska (4. Mai 2004)

Die aktuelle Zeit bekommst du so:

```
public long gettime()                             //Methode für aktuelle Zeit in Millisekunden
	{
	  return System.currentTimeMillis();
	}
```

Das einfach jeweils am Anfang und am Ende der Berechnung auslesen, und dann die Anfangszeit von der Endzeit abziehen.
So erhälst du die Laufzeit in Millisekunden.


----------



## Christian Fein (4. Mai 2004)

long start = new Date().getTime();
//was tun
long runningTime = new  Date().getTime() - start;


----------



## Thomas Darimont (4. Mai 2004)

Hallo!

So könnte man das auch machen ...


```
/*
 * Created on 04.05.2004
 
 */

/**
 * @author Thomas Darimont
 */
public class Main {

	public static void main(String[] args) {
		new Main().doIt();
	}

	/**
	 * 
	 */
	private void doIt() {
		long time = -System.currentTimeMillis();
		System.out.println("Expensive Method Call....");
		System.out.println(time + System.currentTimeMillis() + "ms");
		
	}
}
```

Gruß Tom


----------



## ADA&QS (5. Mai 2004)

Es bleibt noch anzumerken das die Zeitmessung bei Java mit vorsicht zu geniessen ist. Ein Abweichung von 2 sec bei mehrmaligen  Ausfuhren eines kleine programm ist schon vorgekommen.


----------



## Christian Fein (5. Mai 2004)

> _Original geschrieben von ADA&QS _
> *Es bleibt noch anzumerken das die Zeitmessung bei Java mit vorsicht zu geniessen ist. Ein Abweichung von 2 sec bei mehrmaligen  Ausfuhren eines kleine programm ist schon vorgekommen. *



Du kannst halt nicht bestimmen, wann der GC läuft, und wann nicht. Wenn der GarbageCollector bei einer Messung gleichzeitig läuft, und bei der zweiten nicht, dann dann sind diese Unterschiede klar. Daher immer minimum 10 Zeitmessungen laufen lassen, und Mittelmass und Höchst und Tiefstmass als Masseinheit nehmen.


----------



## ADA&QS (5. Mai 2004)

Wenn nur der GC ware, denn konnte man mit der durch Vergabe von Prioritaet aushebeln siehe Realtime Java von Burns, aber den Einfluss durch das BS und der vrituelle Maschine ist nicht zu unterschatzen.


----------



## Christian Fein (5. Mai 2004)

Ja es gibt aber profiling Werkzeuge mit denen mann recht genau messen kann.

Aber um den Flaschenhals einer Anwendung zu finden sind z.b Junit Tests perfekt, und da reicht dann auch das über date.getTime();


----------



## WebOlli (10. Mai 2004)

> _Original geschrieben von Christian Fein _
> *long start = new Date().getTime();
> //was tun
> long runningTime = new  Date().getTime() - start; *



seltsamerweise bekomme ich immer eine 0 (Null) als runningTime heraus, wenn ich das so mache....
woran kann's liegen?


----------



## Christian Fein (11. Mai 2004)

Wie viel Code steckt denn zwischen der Messung?


----------



## Thomas Darimont (11. Mai 2004)

Hallo!

Wäre es nicht besser, ein date Object wieder zu verwenden, statt es imemr wieder neu zu erzeugen?

So ungefähr:


```
import java.text.SimpleDateFormat;
import java.util.Date;

/*
 * Created on 11.05.2004
 *
 */

/**
 * @author Administrator
 *
 */
public class TimeTest {

	public static void main(String[] args) {
		new TimeTest().doIt();
	}

	/**
	 * 
	 */
	private void doIt() {
		// TODO Auto-generated method stub
		long time;
		SimpleDateFormat sdf = new SimpleDateFormat("mm:ss:SS");
		Date date = new Date();
		
		while (true) {

			time = -System.currentTimeMillis();
			//
			// ganz lange operation...
			//
			try {
				Thread.sleep(50l);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			time += System.currentTimeMillis();
			date.setTime(time);
			System.out.println(sdf.format(date));

		}

	}
}
```

Edit mit Java 5 gehts natürlich noch genauer ->  System.nanoTime();

Gruß Tom


----------



## WebOlli (11. Mai 2004)

> _Original geschrieben von Christian Fein _
> *Wie viel Code steckt denn zwischen der Messung? *



relativ wenig. ein einfacher ShellSort-Sortieralgorithmus. Aber auch wenn ich ein 10000 Einheiten großes Feld zum sortieren übergebe, bekomme ich ne 0....


----------

