Pertanyaan ini hanya untuk saya karena saya selalu suka menulis kode yang dioptimalkan yang dapat berjalan juga di server lambat yang murah (atau server dengan BANYAK lalu lintas)
Saya melihat sekeliling dan saya tidak dapat menemukan jawaban. Saya bertanya-tanya apa yang lebih cepat di antara dua contoh tersebut dengan mengingat bahwa kunci array dalam kasus saya tidak penting (pseudo-code secara alami):
<?php
$a = array();
while($new_val = 'get over 100k email addresses already lowercased'){
if(!in_array($new_val, $a){
$a[] = $new_val;
//do other stuff
}
}
?>
<?php
$a = array();
while($new_val = 'get over 100k email addresses already lowercased'){
if(!isset($a[$new_val]){
$a[$new_val] = true;
//do other stuff
}
}
?>
Karena poin pertanyaannya bukanlah tabrakan array, saya ingin menambahkan bahwa jika Anda takut untuk menyisipkan bertabrakan $a[$new_value]
, Anda dapat menggunakan $a[md5($new_value)]
. itu masih dapat menyebabkan tabrakan, tetapi akan menghilangkan kemungkinan serangan DoS saat membaca dari file yang disediakan pengguna ( http://nikic.github.com/2011/12/28/Supercolliding-a-PHP-array.html )
sumber
Jawaban:
Jawabannya sejauh ini tepat. Menggunakan
isset
dalam kasus ini lebih cepat karenain_array
harus memeriksa setiap nilai sampai menemukan kecocokan.in_array
fungsi bawaan.Ini dapat ditunjukkan dengan menggunakan larik dengan nilai (10.000 dalam pengujian di bawah), memaksa
in_array
untuk melakukan lebih banyak pencarian.Ini dibangun di atas tolok ukur Jason dengan mengisi beberapa nilai acak dan sesekali menemukan nilai yang ada dalam larik. Semuanya acak, jadi berhati-hatilah karena waktu akan berfluktuasi.
sumber
isset()
lebih cepat.Meskipun harus jelas,
isset()
hanya menguji satu nilai. Sedangkanin_array()
akan mengulangi seluruh array, menguji nilai setiap elemen.Pembandingan kasar cukup mudah digunakan
microtime()
.Hasil:
Catatan: Hasil serupa terlepas dari apakah ada atau tidak.
Kode:
Sumber daya tambahan
Saya mendorong Anda untuk juga melihat:
sumber
microtime()
atau alat lain. Sangat berharga.in_array
fungsi versus menggunakanisset
built-in. Ini akan lebih baik dengan array yang berisi sekumpulan kunci acak dan terkadang mencari kunci / nilai yang ada.while
danforeach
bahwa pada setiap penyegaran saya mendapatkan "pemenang" yang berbeda. itu selalu bergantung pada terlalu banyak variabel server, dan yang terbaik adalah mengulang berkali-kali pada waktu yang berbeda dan mendapatkan yang menang lebih sering, atau hanya tahu apa yang terjadi di latar belakang dan ketahuilah bahwa itu akan menjadi pemenang akhir tidak peduli apaisset()
, apa yang membuat Anda berpikir bahwa meneruskannya ke array yang lebih besar akan membuatnya lebih cepat ?Menggunakan
isset()
mengambil keuntungan dari pencarian yang lebih cepat karena menggunakan tabel hash , menghindari kebutuhan untukO(n)
pencarian.Kuncinya di-hash terlebih dahulu menggunakan fungsi hash djb untuk menentukan keranjang kunci dengan hash serupa di
O(1)
. Bucket kemudian ditelusuri secara berulang hingga kunci yang tepat ditemukan diO(n)
.Jika tidak ada benturan hash yang disengaja , pendekatan ini menghasilkan kinerja yang jauh lebih baik daripada
in_array()
.Perhatikan bahwa saat menggunakan
isset()
dengan cara yang Anda tunjukkan, meneruskan nilai akhir ke fungsi lain membutuhkan penggunaanarray_keys()
untuk membuat larik baru. Kompromi memori dapat dilakukan dengan menyimpan data di kunci dan nilai.Memperbarui
Cara yang baik untuk melihat bagaimana keputusan desain kode Anda memengaruhi kinerja waktu proses, Anda dapat memeriksa versi terkompilasi dari skrip Anda:
echo isset($arr[123])
echo in_array(123, $arr)
Tidak hanya
in_array()
menggunakanO(n)
pencarian yang relatif tidak efisien , itu juga perlu dipanggil sebagai fungsi (DO_FCALL
) sedangkanisset()
menggunakan satu opcode (ZEND_ISSET_ISEMPTY_DIM_OBJ
) untuk ini.sumber
Yang kedua akan lebih cepat, karena hanya mencari kunci array tertentu dan tidak perlu mengulang seluruh array sampai ditemukan (akan melihat setiap elemen array jika tidak ditemukan)
sumber
isset()
jika tidak ditemukan?