Apakah count()
benar-benar menghitung semua elemen array PHP, atau apakah nilai ini disimpan di cache di suatu tempat dan baru saja diambil?
php
arrays
performance
Dexter
sumber
sumber
Jawaban:
Nah, kita bisa lihat sumbernya:
PHP_FUNCTION(count)
panggilanphp_count_recursive()
, yang pada gilirannya memanggilzend_hash_num_elements()
larik non-rekursif, yang diimplementasikan dengan cara ini:Jadi Anda bisa lihat, ini
O(1)
untuk$mode = COUNT_NORMAL
.sumber
IS_CONSISTENT(ht)
dilakukannya?Dalam PHP 5+, panjangnya disimpan dalam array sehingga penghitungan tidak dilakukan setiap waktu.
EDIT: Anda juga mungkin menemukan analisis ini menarik: PHP Count Performance . Meskipun panjang array dipertahankan oleh array, sepertinya lebih cepat untuk menahannya jika Anda akan memanggil
count()
berkali-kali.sumber
PHP menyimpan ukuran array secara internal, tetapi Anda masih membuat pemanggilan fungsi ketika yang lebih lambat daripada tidak membuatnya, jadi Anda akan ingin menyimpan hasilnya dalam variabel jika Anda melakukan sesuatu seperti menggunakannya dalam putaran:
Sebagai contoh,
Selain itu, Anda tidak selalu bisa memastikan
count
dipanggil dalam array. Jika dipanggil pada objek yang mengimplementasikanCountable
misalnya,count
metode objek itu akan dipanggil.sumber
the count method of that object will be called
, dapatkah Anda menjelaskan sedikit tentang iniCountable
antarmuka, maka pemanggilancount($object)
sama dengan memanggil$object->count()
. Lihat 3v4l.org/oYSSC sebagai contoh.you're still making a function call when which is slower than not making one
Pernyataan ini bisa saja salah. Jika Anda melakukan traversal manual, itu adalahO(n)
operasi. Tetapi jika Anda hanya ingin mengambil nilai yang telah dihitung sebelumnya, maka operasinya adalahO(1)
.