Secara berlawanan, versi tercepat, di Hotspot 8, adalah:
MyClass[] arr = myList.toArray(new MyClass[0]);
Saya telah menjalankan tolok ukur mikro menggunakan jmh hasil dan kode di bawah ini, menunjukkan bahwa versi dengan array kosong secara konsisten mengungguli versi dengan array yang telah ditentukan. Perhatikan bahwa jika Anda dapat menggunakan kembali array yang ada dengan ukuran yang benar, hasilnya mungkin berbeda.
Hasil benchmark (skor dalam mikrodetik, lebih kecil = lebih baik):
Benchmark (n) Mode Samples Score Error Units
c.a.p.SO29378922.preSize 1 avgt 30 0.025 ▒ 0.001 us/op
c.a.p.SO29378922.preSize 100 avgt 30 0.155 ▒ 0.004 us/op
c.a.p.SO29378922.preSize 1000 avgt 30 1.512 ▒ 0.031 us/op
c.a.p.SO29378922.preSize 5000 avgt 30 6.884 ▒ 0.130 us/op
c.a.p.SO29378922.preSize 10000 avgt 30 13.147 ▒ 0.199 us/op
c.a.p.SO29378922.preSize 100000 avgt 30 159.977 ▒ 5.292 us/op
c.a.p.SO29378922.resize 1 avgt 30 0.019 ▒ 0.000 us/op
c.a.p.SO29378922.resize 100 avgt 30 0.133 ▒ 0.003 us/op
c.a.p.SO29378922.resize 1000 avgt 30 1.075 ▒ 0.022 us/op
c.a.p.SO29378922.resize 5000 avgt 30 5.318 ▒ 0.121 us/op
c.a.p.SO29378922.resize 10000 avgt 30 10.652 ▒ 0.227 us/op
c.a.p.SO29378922.resize 100000 avgt 30 139.692 ▒ 8.957 us/op
Untuk referensi, kodenya:
@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
public class SO29378922 {
@Param({"1", "100", "1000", "5000", "10000", "100000"}) int n;
private final List<Integer> list = new ArrayList<>();
@Setup public void populateList() {
for (int i = 0; i < n; i++) list.add(0);
}
@Benchmark public Integer[] preSize() {
return list.toArray(new Integer[n]);
}
@Benchmark public Integer[] resize() {
return list.toArray(new Integer[0]);
}
}
Anda dapat menemukan hasil yang serupa, analisis lengkap, dan diskusi di posting blog Array of Wisdom of the Ancients . Untuk meringkas: kompiler JVM dan JIT berisi beberapa optimisasi yang memungkinkannya untuk membuat dan menginisialisasi array dengan ukuran baru dengan murah, dan optimisasi tersebut tidak dapat digunakan jika Anda membuat array sendiri.