2017-12-05 5 views
0

Also bin ich noch ziemlich neu im Programmieren und ich frage mich nur, ob ich diese Benchmarks richtig mache. Für die Warteschlange gebe ich im Grunde eine Liste mit Ganzzahlen, und ich würde Zeit, wie es dauern würde, bis es eine Nummer auf der Liste finden würde. Was die HashMap betrifft, ist es im Prinzip die gleiche Idee, ich würde mal sagen, wie lange es dauern würde, eine Nummer von der Liste zu bekommen. Auch für beide von ihnen würde ich auch Zeit nehmen, wie lange es dauern würde, den Inhalt der Liste zu entfernen. Jede Hilfe dazu wäre willkommen. Vielen Dank!Java Datenstruktur Benchmark

// Create a queue, and test its performance 
PriorityQueue<Integer> queue = new PriorityQueue <> (list); 
System.out.println("Member test time for Priority Queue is " + 
     getTestTime(queue) + " milliseconds"); 
     System.out.println("Remove element time for Priority Queue is " + 
     getRemoveTime(queue) + " milliseconds"); 

// Create a hash map, and test its performance 
HashMap<Integer, Integer> newmap = new HashMap<Integer, Integer>(); 
for (int i = 0; i <N;i++) { 
    newmap.put(i, i); 
} 
System.out.println("Member test time for hash map is " + 
     getTestTime1(newmap) + " milliseconds"); 
System.out.println("Remove element time for hash map is " + 
     getRemoveTime1(newmap) + " milliseconds"); 
} 



public static long getTestTime(Collection<Integer> c) { 
    long startTime = System.currentTimeMillis(); 

// Test if a number is in the collection 
for (int i = 0; i < N; i++) 
    c.contains((int)(Math.random() * 2 * N)); 

return System.currentTimeMillis() - startTime; 
} 

public static long getTestTime1(HashMap<Integer,Integer> newmap) { 
    long startTime = System.currentTimeMillis(); 

    // Test if a number is in the collection 
    for (int i = 0; i < N; i++) 
     newmap.containsKey((int)(Math.random() * 2 * N)); 

    return System.currentTimeMillis() - startTime; 
} 

public static long getRemoveTime(Collection<Integer> c) { 
long startTime = System.currentTimeMillis(); 

    for (int i = 0; i < N; i++) 
    c.remove(i); 

return System.currentTimeMillis() - startTime; 
} 
public static long getRemoveTime1(HashMap<Integer,Integer> newmap) { 
    long startTime = System.currentTimeMillis(); 

    for (int i = 0; i < N; i++) 
     newmap.remove(i); 

     return System.currentTimeMillis() - startTime; 
    } 
} 
+0

Sie keine Zeitmessungen für Benchmarks von Hand schreiben, es ist wirklich nicht so einfach, es richtig zu machen. Verwenden Sie so etwas wie JMH: http://openjdk.java.net/projects/code-tools/jmh/ –

+0

Suchen Sie SO nach Ihrem Problem, bevor Sie eine Frage stellen. Die folgende Frage hat eine Menge guter Sachen in den Antworten: https://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java – mhvelplund

Antwort

0

Ich habe zwei Vorschläge. Erstens, wenn Sie Benchmarking durchführen, arbeiten Sie unmittelbar vor und nach dem Code, den Sie evaluieren. Sie möchten nicht, dass Ihre Benchmark-Aktivität das Ergebnis beeinflusst.

Zweitens kann System.currentTimeMillis(), je nach Betriebssystem, nur innerhalb von 10 Millisekunden genau sein. Besser ist es, System.nanoTime() zu verwenden, das auf vielleicht 200 Nanosekunden genau ist. Teile durch 1_000_000, um Millisekunden zu erhalten.

Praktisch

final long startNanos, endNanos; 
startNanos = System.nanoTime(); 
// your code goes here 
endNanos = System.nanoTime(); 
// display the results of the benchmark