Saya punya model dengan kemungkinan ribuan objek. Saya bertanya-tanya apa yang akan menjadi cara paling efisien untuk menyimpannya dan mengambil satu objek setelah saya memilikinya id. Nomornya panjang.
Jadi ini adalah 2 opsi yang saya pikirkan. dalam opsi satu itu adalah array sederhana dengan indeks yang bertambah. dalam opsi 2 ini adalah array asosiatif dan mungkin sebuah objek, jika itu membuat perbedaan. Pertanyaan saya adalah mana yang lebih efisien, ketika saya sebagian besar perlu mengambil satu objek, tetapi juga kadang-kadang loop melalui mereka dan urutkan.
Opsi satu dengan array non asosiatif:
var a = [{id: 29938, name: 'name1'},
{id: 32994, name: 'name1'}];
function getObject(id) {
for (var i=0; i < a.length; i++) {
if (a[i].id == id)
return a[i];
}
}
Opsi dua dengan array asosiatif:
var a = []; // maybe {} makes a difference?
a[29938] = {id: 29938, name: 'name1'};
a[32994] = {id: 32994, name: 'name1'};
function getObject(id) {
return a[id];
}
Memperbarui:
OK, saya mendapatkan bahwa menggunakan array pada opsi kedua adalah keluar dari pertanyaan. Jadi baris deklarasi pilihan kedua harus benar-benar: var a = {};
dan satu-satunya pertanyaan adalah: apa yang berkinerja lebih baik dalam mengambil objek dengan id yang diberikan: array atau objek di mana id adalah kuncinya.
dan juga, akankah jawabannya berubah jika saya harus mengurutkan daftar berkali-kali?
sumber
Jawaban:
Versi singkat: Array sebagian besar lebih cepat dari objek. Tetapi tidak ada solusi yang 100% benar.
Perbarui 2017 - Tes dan Hasil
Posting Asli - Penjelasan
Ada beberapa kesalahpahaman dalam pertanyaan Anda.
Tidak ada array asosiatif di Javascript. Hanya Array dan Objek.
Ini adalah array:
Ini juga sebuah array:
Ini pada dasarnya adalah array dengan lubang di dalamnya, karena setiap array memang memiliki pengindeksan terus-menerus. Ini lebih lambat daripada array tanpa lubang. Tetapi iterasi secara manual melalui array bahkan lebih lambat (kebanyakan).
Ini adalah objek:
Berikut ini adalah tes kinerja dari tiga kemungkinan:
Lookup Array vs Holey Array vs Object Performance Test
Bacaan luar biasa tentang topik-topik ini di Smashing Magazine: Menulis JavaScript cepat dan efisien memori
sumber
if (a1[i].id = id) result = a1[i];
Seharusnya:if (a1[i].id === id) result = a1[i];
Uji http://jsperf.com/array-vs-object-performance/37 mengoreksi ituSama sekali bukan pertanyaan kinerja, karena array dan objek bekerja sangat berbeda (atau setidaknya seharusnya). Array memiliki indeks kontinu
0..n
, sementara objek memetakan kunci arbitrer ke nilai arbitrer. Jika Anda ingin menyediakan kunci tertentu, satu-satunya pilihan adalah objek. Jika Anda tidak peduli dengan kunci, array itu.Jika Anda mencoba mengatur kunci acak (numerik) pada array, Anda benar-benar mengalami kerugian kinerja , karena biasanya array akan mengisi semua indeks di antara:
(Perhatikan bahwa array sebenarnya tidak mengandung 99
undefined
nilai, tetapi akan berperilaku seperti ini karena Anda [seharusnya] mengulangi array di beberapa titik.)Literal untuk kedua opsi harus membuatnya sangat jelas bagaimana mereka dapat digunakan:
sumber
user_id
" vs "objek yang memiliki kunci karena denganuser_id
demikian objek pengguna dapat diakses menggunakanuser_id
kunci sebagai"? Mana yang lebih baik dalam hal kinerja? Setiap saran tentang hal ini dihargai :)Dengan ES6 cara paling performan adalah menggunakan Peta.
Anda dapat menggunakan fitur ES6 hari ini menggunakan shim ( https://github.com/es-shims/es6-shim ).
Kinerja akan bervariasi tergantung pada browser dan skenario. Tapi di sini adalah satu contoh di mana
Map
yang paling performant: https://jsperf.com/es6-map-vs-object-properties/2REFERENSI https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map
sumber
efficiency
.Dalam NodeJS jika Anda tahu
ID
, perulangan melalui array sangat lambat dibandingkan denganobject[ID]
.Dan hasilnya:
Bahkan jika ID pencarian adalah yang pertama dalam array / objek:
sumber
Saya mencoba untuk membawa ini ke dimensi berikutnya, secara harfiah.
Diberikan array 2 dimensi, di mana sumbu x dan y selalu sama panjang, apakah lebih cepat untuk:
a) mencari sel dengan membuat array dua dimensi dan mencari indeks pertama, diikuti oleh indeks kedua, yaitu:
atau
b) membuat objek dengan representasi string dari koordinat x dan y, dan kemudian melakukan pencarian tunggal pada objek tersebut, yaitu:
Hasil:
Ternyata lebih cepat melakukan dua pencarian indeks numerik pada array, daripada satu pencarian properti pada objek.
Hasil di sini:
http://jsperf.com/arr-vs-obj-lookup-2
sumber
Itu tergantung penggunaan. Jika kasing objek adalah sangat cepat.
Berikut ini adalah contoh Plunker untuk menguji kinerja pencarian array dan objek.
https://plnkr.co/edit/n2expPWVmsdR3zmXvX4C?p=preview
Anda akan melihat itu; Mencari 5.000 item dalam 5.000 koleksi array panjang, ambil alih
3000
milidetikNamun Mencari 5.000 item di objek memiliki 5.000 properti, ambil saja
2
atau3
milidetikJuga membuat pohon objek tidak membuat perbedaan besar
sumber
Saya memiliki masalah serupa yang saya hadapi di mana saya perlu menyimpan lilin langsung dari sumber acara terbatas pada x item. Saya bisa menyimpannya di objek di mana cap waktu setiap lilin akan bertindak sebagai kunci dan lilin itu sendiri akan bertindak sebagai nilainya. Kemungkinan lain adalah bahwa saya bisa menyimpannya di sebuah array di mana setiap item adalah lilin itu sendiri. Satu masalah tentang lilin langsung adalah bahwa mereka terus mengirim pembaruan pada stempel waktu yang sama di mana pembaruan terbaru menyimpan data terbaru sehingga Anda memperbarui item yang ada atau menambah yang baru. Jadi di sini adalah tolok ukur yang bagus yang mencoba untuk menggabungkan semua 3 kemungkinan. Array dalam solusi di bawah ini minimal 4x lebih cepat rata-rata. Jangan ragu untuk bermain
Kesimpulan 10 adalah batasnya di sini
sumber
Jika Anda memiliki array yang diurutkan maka Anda dapat melakukan pencarian biner dan itu jauh lebih cepat daripada pencarian objek, Anda dapat melihat jawaban saya di sini:
Cara mencari lebih cepat dalam Array yang diurutkan menggunakan Javascript
sumber