Morgen,
gerade hat mich ein Kommilitone gefragt, ob eine ArrayList<Integer> gegenüber einem int oder Integer Array signifikate Nachteile mit sich bringt. Pauschal habe ich erstmal gesagt, dass ein int Array theoretisch schneller erzeugt und befüllt werden könne als ein Integer Array oder eine ArrayList<Integer>. Na ja, ich habe dann fix ein Benchmark geschrieben und war doch etwas verblüfft.
Als VM Parameter habe ich "-client -Xms768m -Xmx768m -verbose:gc" benutzt (-server ist nicht viel anders), eine Oracle 32-bit JRE 6u24 und als CPU einen AMD Turion64 X2 (2 CPU Kerne).
Hier der Code für meine Benchmark Klasse:
Der Output:
Platzierung:
Habe ich einen Fehler beim Benchmark gemacht?
Oder stimmen die Ergebnisse und wenn ja, warum? :rtfm:
Kann jemand Vergleichswerte posten? ???:L
gerade hat mich ein Kommilitone gefragt, ob eine ArrayList<Integer> gegenüber einem int oder Integer Array signifikate Nachteile mit sich bringt. Pauschal habe ich erstmal gesagt, dass ein int Array theoretisch schneller erzeugt und befüllt werden könne als ein Integer Array oder eine ArrayList<Integer>. Na ja, ich habe dann fix ein Benchmark geschrieben und war doch etwas verblüfft.
Als VM Parameter habe ich "-client -Xms768m -Xmx768m -verbose:gc" benutzt (-server ist nicht viel anders), eine Oracle 32-bit JRE 6u24 und als CPU einen AMD Turion64 X2 (2 CPU Kerne).
Hier der Code für meine Benchmark Klasse:
Java:
public class IntegerTests {
private static Runtime rt = Runtime.getRuntime();
public static void main(String[] args) {
long max = rt.maxMemory(),
total = rt.totalMemory(),
free = rt.freeMemory(),
used = total - free;
System.out.println("CPUs: "+rt.availableProcessors()
+"\nMaxMemory (in byte): "+max
+"\nTotalMemory (in byte): "+total
+"\nFreeMemory (in byte): "+free
+"\nUsedMemory (in byte): "+used);
int benchmarkLoop = 10, elementLoop = 10000000;
long start = 0;
for (int z = 1; z <= benchmarkLoop; z++) {
System.out.println("\nRUN "+z);
start = System.currentTimeMillis();
List<Integer> list = new ArrayList<Integer>(elementLoop);
for (int i = 0; i < list.size(); i++){
list.add(i); // Autoboxing
}
printResult("list", start);
start = System.currentTimeMillis();
Integer[] integerA = new Integer[elementLoop];
for (int i = 0; i < integerA.length; i++) {
integerA[i] = i; // Autoboxing
}
printResult("integer array", start);
start = System.currentTimeMillis();
int[] intA = new int[elementLoop];
for (int i = 0; i < intA.length; i++){
intA[i] = i;
}
printResult("int array", start);
}
}
private static void printResult(String id, long start) {
long result = System.currentTimeMillis() - start;
System.out.println("\tTime ("+id+"): "+result+" ms");
System.out.print("\t\tRun GC: ");
System.gc();
System.out.println("\t\tGC END");
}
}
Der Output:
Code:
CPUs: 2
MaxMemory (in byte): 778502144
TotalMemory (in byte): 778502144
FreeMemory (in byte): 774205584
UsedMemory (in byte): 4296560
RUN 1
Time (list): 55 ms
Run GC: [Full GC 43258K->39182K(760256K), 0.1318455 secs]
GC END
Time (integer array): 344 ms
Run GC: [Full GC 237687K->125K(760256K), 0.0983542 secs]
GC END
Time (int array): 62 ms
Run GC: [Full GC 42971K->125K(760256K), 0.0083771 secs]
GC END
RUN 2
Time (list): 30 ms
Run GC: [Full GC 42971K->125K(760256K), 0.0106661 secs]
GC END
Time (integer array): 206 ms
Run GC: [Full GC 198073K->125K(760256K), 0.1107050 secs]
GC END
Time (int array): 62 ms
Run GC: [Full GC 42825K->125K(760256K), 0.0079840 secs]
GC END
RUN 3
Time (list): 30 ms
Run GC: [Full GC 42825K->125K(760256K), 0.0085653 secs]
GC END
Time (integer array): 209 ms
Run GC: [Full GC 195608K->125K(760256K), 0.1023137 secs]
GC END
Time (int array): 68 ms
Run GC: [Full GC 42727K->125K(760256K), 0.0084573 secs]
GC END
RUN 4
Time (list): 27 ms
Run GC: [Full GC 42727K->125K(760256K), 0.0083546 secs]
GC END
Time (integer array): 207 ms
Run GC: [Full GC 198469K->125K(760256K), 0.1033306 secs]
GC END
Time (int array): 65 ms
Run GC: [Full GC 42667K->125K(760256K), 0.0081224 secs]
GC END
RUN 5
Time (list): 28 ms
Run GC: [Full GC 42667K->125K(760256K), 0.0097044 secs]
GC END
Time (integer array): 206 ms
Run GC: [Full GC 195790K->125K(760256K), 0.1003557 secs]
GC END
Time (int array): 64 ms
Run GC: [Full GC 42625K->125K(760256K), 0.0090278 secs]
GC END
RUN 6
Time (list): 28 ms
Run GC: [Full GC 42625K->125K(760256K), 0.0097856 secs]
GC END
Time (integer array): 206 ms
Run GC: [Full GC 197308K->125K(760256K), 0.0992156 secs]
GC END
Time (int array): 62 ms
Run GC: [Full GC 42599K->125K(760256K), 0.0080075 secs]
GC END
RUN 7
Time (list): 30 ms
Run GC: [Full GC 42599K->125K(760256K), 0.0094942 secs]
GC END
Time (integer array): 214 ms
Run GC: [Full GC 196136K->125K(760256K), 0.1047523 secs]
GC END
Time (int array): 74 ms
Run GC: [Full GC 42581K->125K(760256K), 0.0094507 secs]
GC END
RUN 8
Time (list): 28 ms
Run GC: [Full GC 42581K->125K(760256K), 0.0084456 secs]
GC END
Time (integer array): 211 ms
Run GC: [Full GC 198688K->125K(760256K), 0.1003885 secs]
GC END
Time (int array): 63 ms
Run GC: [Full GC 42573K->125K(760256K), 0.0085580 secs]
GC END
RUN 9
Time (list): 28 ms
Run GC: [Full GC 42573K->125K(760256K), 0.0107116 secs]
GC END
Time (integer array): 213 ms
Run GC: [Full GC 198306K->125K(760256K), 0.1009228 secs]
GC END
Time (int array): 63 ms
Run GC: [Full GC 42567K->125K(760256K), 0.0086949 secs]
GC END
RUN 10
Time (list): 30 ms
Run GC: [Full GC 42567K->125K(760256K), 0.0096326 secs]
GC END
Time (integer array): 208 ms
Run GC: [Full GC 198032K->125K(760256K), 0.1002193 secs]
GC END
Time (int array): 64 ms
Run GC: [Full GC 42563K->125K(760256K), 0.0100442 secs]
GC END
- ArrayList<Integer>
- int[] (fast immer doppelt soviel wie eine ArrayList<Integer>)
- Integer[] (ziemlich abgeschlagen)
Habe ich einen Fehler beim Benchmark gemacht?
Oder stimmen die Ergebnisse und wenn ja, warum? :rtfm:
Kann jemand Vergleichswerte posten? ???:L
Zuletzt bearbeitet: