Meskipun jawaban yang mengusulkan untuk menggunakan ArrayList masuk akal di sebagian besar skenario, pertanyaan sebenarnya tentang kinerja relatif belum benar-benar dijawab.
Ada beberapa hal yang dapat Anda lakukan dengan array:
- menciptakannya
- mengatur item
- dapatkan item
- klon / salin
Kesimpulan umum
Meskipun operasi mengatur dan mendapatkan agak lebih lambat pada ArrayList (resp. 1 dan 3 nanosecond per panggilan pada mesin saya), ada sangat sedikit overhead menggunakan ArrayList vs array untuk penggunaan non-intensif. Namun ada beberapa hal yang perlu diingat:
- mengubah ukuran operasi pada daftar (saat memanggil
list.add(...)) mahal dan orang harus mencoba mengatur kapasitas awal pada tingkat yang memadai bila memungkinkan (perhatikan bahwa masalah yang sama muncul ketika menggunakan array)
- ketika berhadapan dengan primitif, array dapat secara signifikan lebih cepat karena mereka akan memungkinkan seseorang untuk menghindari banyak konversi tinju / unboxing
- aplikasi yang hanya mendapat / menetapkan nilai dalam ArrayList (tidak terlalu umum!) dapat melihat peningkatan kinerja lebih dari 25% dengan beralih ke array
Hasil terperinci
Berikut adalah hasil yang saya ukur untuk ketiga operasi menggunakan perpustakaan pembandingan jmh (kali dalam nanodetik) dengan JDK 7 pada mesin desktop x86 standar. Perhatikan bahwa ArrayList tidak pernah diubah ukurannya dalam pengujian untuk memastikan hasil yang sebanding. Kode benchmark tersedia di sini .
Pembuatan Array / ArrayList
Saya menjalankan 4 tes, menjalankan pernyataan berikut:
- buatArray1:
Integer[] array = new Integer[1];
- createList1:
List<Integer> list = new ArrayList<> (1);
- buatArray10000:
Integer[] array = new Integer[10000];
- buatList10000:
List<Integer> list = new ArrayList<> (10000);
Hasil (dalam nanodetik per panggilan, kepercayaan 95%):
a.p.g.a.ArrayVsList.CreateArray1 [10.933, 11.097]
a.p.g.a.ArrayVsList.CreateList1 [10.799, 11.046]
a.p.g.a.ArrayVsList.CreateArray10000 [394.899, 404.034]
a.p.g.a.ArrayVsList.CreateList10000 [396.706, 401.266]
Kesimpulan: tidak ada perbedaan yang nyata .
dapatkan operasi
Saya menjalankan 2 tes, menjalankan pernyataan berikut:
- getList:
return list.get(0);
- getArray:
return array[0];
Hasil (dalam nanodetik per panggilan, kepercayaan 95%):
a.p.g.a.ArrayVsList.getArray [2.958, 2.984]
a.p.g.a.ArrayVsList.getList [3.841, 3.874]
Kesimpulan: mendapatkan dari array sekitar 25% lebih cepat daripada dari ArrayList, meskipun perbedaannya hanya pada urutan satu nanosecond.
mengatur operasi
Saya menjalankan 2 tes, menjalankan pernyataan berikut:
- setList:
list.set(0, value);
- setArray:
array[0] = value;
Hasil (dalam nanodetik per panggilan):
a.p.g.a.ArrayVsList.setArray [4.201, 4.236]
a.p.g.a.ArrayVsList.setList [6.783, 6.877]
Kesimpulan: operasi set pada array sekitar 40% lebih cepat dari pada daftar, tetapi, seperti untuk mendapatkan, setiap operasi set membutuhkan beberapa nanodetik - jadi untuk perbedaan untuk mencapai 1 detik, seseorang perlu mengatur item dalam daftar / array ratusan jutaan kali!
klon / salin
Mendelegasikan copy constructor ArrayList ke Arrays.copyOfsehingga kinerja identik dengan copy array (menyalin array melalui clone, Arrays.copyOfatau System.arrayCopy tidak membuat perbedaan materi yang berarti ).