# System.currentTimeMillis();



## classio10 (2. Jun 2010)

Hallo,
ich soll mit System.currentTimeMillis(); die Effizient von _Array, ArrayList und LinkedList_ gegenüberstellen, undzwar für den Operation: einfügen von elemente am ende. dafür soll ich ein testprogramm schreiben. 
*meine frage dazu:*
kann ich System.currentTimeMillis(); in einem programm zweimal oder mehrmals verwenden. ich verstehe nicht, wie die gegenüberstellen soll. ich kann z.b. so 

```
Long start = System.currentTimeMillis();
		        
		    	for (int i=0; i<n; i++) {
		            list1.add("element #" + i);
		          }
		         
		    	System.out.println(System.currentTimeMillis() - start);
```
die effizient methode einfügen von elemente am ende bei _ArrayList_ ausrechnen.
Könnte mir mal einer ein beispiel zeigen wie das gehen könnte??

Gruß
cassio


----------



## Der Müde Joe (2. Jun 2010)

>Könnte mir mal einer ein beispiel zeigen wie das gehen könnte??

Micro Benchmarks....meisst sinnlos....
AngelikaLanger.com - Java Performance - Micro-Benchmarking and HotSpot Compilation - Angelika Langer Training/Consulting


----------



## ARadauer (2. Jun 2010)

das was du geschrieben hast, stimmt eigentlich eh... wo ist dein problem?
kommt 0 raus? dann ist dein n zu klein... das sollte schon im bereich der millionen liegen, da du sonst keine wesentlichen unterschiede merkst...


----------



## SlaterB (2. Jun 2010)

> Könnte mir mal einer ein beispiel zeigen wie das gehen könnte??

abgesehen von den allgemeinen Problemen gehts so wie in deinem Beispiel, nicht getestet?


----------



## ARadauer (2. Jun 2010)

Der Müde Joe hat gesagt.:


> >Micro Benchmarks....meisst sinnlos





			
				classio10 hat gesagt.:
			
		

> ich soll mit


wenn es sich der lehrer einbildet... warum nicht...


----------



## classio10 (2. Jun 2010)

Der Müde Joe hat gesagt.:


> >Könnte mir mal einer ein beispiel zeigen wie das gehen könnte??
> 
> Micro Benchmarks....meisst sinnlos....
> AngelikaLanger.com - Java Performance - Micro-Benchmarking and HotSpot Compilation - Angelika Langer Training/Consulting




sorry, aber bin ein anfänger, da verstehe ich ja kaum was..
einfaches beispiel wäre besser, oder eine eklärung


----------



## MiDniGG (2. Jun 2010)

classio10 hat gesagt.:


> sorry, aber bin ein anfänger, da verstehe ich ja kaum was..
> einfaches beispiel wäre besser, oder eine eklärung



Ähm. Wir wissen immer noch nicht genau Dein Problem ist... Hast Du dir die weiteren Beiträge durchgelesen?


----------



## Marco13 (2. Jun 2010)

Er gibt vermutlich 0 aus, weil das n zu klein ist.


----------



## classio10 (2. Jun 2010)

ARadauer hat gesagt.:


> das was du geschrieben hast, stimmt eigentlich eh... wo ist dein problem?
> kommt 0 raus?


ich muss das ja noch mit Array und LinkedList vergleichen



ARadauer hat gesagt.:


> dann ist dein n zu klein... das sollte schon im bereich der millionen liegen, da du sonst keine wesentlichen unterschiede merkst...


ja stimmt, hier fehlt das, ich habe n=150000, dann ist das ergebniss auch größer als 0


----------



## fastjack (2. Jun 2010)

Im Prinzip kannst Du das so oft aufrufen, wie Du willst. Es werden immer die aktellen Millis wieder gegeben, darum current. Die Zeitmessung ist richtig programmiert. Wenn Du immer0 als Differenz erhältst, bedeutete das einfach, das das Adden null Millisekunden gedauert hat. Whl. sollst Du eher messen, wie lange das gesamte Adden von 100.000 Elementen oder so dauert. Daraus kannst Du ja dann auch einen Schnitt ziehen.


----------



## Gastredner (2. Jun 2010)

fastjack hat gesagt.:


> Wenn Du immer 0 als Differenz erhältst, bedeutete das einfach, das das Adden null Millisekunden gedauert hat.


Oder dass es zumindest kürzer als die rechnerinterne Zeitauflösung war, die beispielsweise unter XP bei etwa 15ms liegt.


----------



## Der Müde Joe (2. Jun 2010)

>n=150000, dann ist das ergebniss auch größer als 0 

Ich krieg immer null ;-)

```
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;


public class TestArray {

	static final int RUNS = 10000000;

	public static void main(String... _) {
		int TIMES = 10;
		long time = 0;
		for (int i = 0; i < TIMES; i++) {
			long t = addTest(new ArrayList<Entry>());
			time += t;
			print("ArrayList no init", t);
		}
		System.out.println("Average = " + time / TIMES);
		time = 0;
		for (int i = 0; i < TIMES; i++) {
			long t = addTest(new ArrayList<Entry>(RUNS));
			time += t;
			print("ArrayList init", t);
		}
		System.out.println("Average = " + time / TIMES);
		time = 0;
		for (int i = 0; i < TIMES; i++) {
			long t = addTest(new LinkedList<Entry>());
			time += t;
			print("LinkedList", t);
		}
		System.out.println("Average = " + time / TIMES);
	}

	private static void print(String message, long time) {
		System.out.print(message);
		System.out.print(" Total: " + time);
		System.out.println(" One: " + time / RUNS);
	}

	private static long addTest(List<Entry> list) {
		Entry entry = new Entry();
		long start = System.currentTimeMillis();
		for (int i = 0; i < RUNS; i++) {
			list.add(entry);
		}
		return System.currentTimeMillis() - start;
	}

	static class Entry {

		public Entry() {}
	}
}
```


----------



## fastjack (2. Jun 2010)

Wahrscheinlich bekommt er einmal 1, wgegen GC oder so. Das Messen von einem add-Aufruf ist sowieso sinnlos. Ich denke er sollte den gesamten Umfang messen, also wie lange das adden von 1M Elementen in verschiedene Listen dauert wtc.


----------



## classio10 (3. Jun 2010)

problem hat sich erledigt, 
vielen dank


----------

