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.copyOf
sehingga kinerja identik dengan copy array (menyalin array melalui clone
, Arrays.copyOf
atau System.arrayCopy
tidak membuat perbedaan materi yang berarti ).