Ich habe versucht, die Leistung meines benutzerdefinierten Iterators über ein einfaches int-Array zu messen. Es ist wirklich einfach, wie unten dargestellt:Benutzerdefinierter Iterator ist langsam
class IntArrayIterator_NoCheck implements Iterator<Integer> {
private final int[] array;
private int counter = 0;
public IntArrayIterator_NoCheck(int[] array) {
this.array = array;
}
@Override
public boolean hasNext() {
return counter < array.length;
}
@Override
public Integer next() {
return array[counter++];
}
}
Nach dem Vergleich Iterator und Trove (http://trove.starlight-systems.com/) zu Arraylist, fand ich seltsame Ergebnisse. Der Test wurde in der folgenden Art und Weise durchgeführt:
- List/Array von 100000 Zufalls int Elemente
- WarmUp
- 10000X Iterieren über ganze Kollektion
- 10000X Iterieren über ganze Kollektion wieder
- Test
- 10000x Iterieren über ganze Sammlung, über System.nanoTime UND ThreadMXBean.getCurrentThreadCpuTime() Messen
Die Trove TIntArrayList Iterator ist die schnellste mit 30 ms Laufzeit. Der Java ArrayList-Iterator hatte eine Laufzeit von 85 ms. Der benutzerdefinierte Iterator über dem einfachen int-Array hatte 320 ms Laufzeit!
Was ist der mögliche Grund für die schreckliche Leistung meines benutzerdefinierten Iterators? Nach der Überprüfung der Iterator-Implementierungen von ArrayList und TIntArrayList sind sie viel komplexer (führen mehr Operationen aus), weshalb ich nicht verstehe, warum sie schneller ist. Könnte mir bitte jemand das erklären?
Schreiben Sie Benchmark-Code nicht manuell, verwenden Sie JMH: http://openjdk.java.net/projects/code-tools/jmh/ – leventov
Vielen Dank für den Vorschlag! Ich werde es mir ansehen. –