Apakah count()benar-benar menghitung semua elemen array PHP, atau apakah nilai ini disimpan di cache di suatu tempat dan baru saja diambil?
Apakah count()benar-benar menghitung semua elemen array PHP, atau apakah nilai ini disimpan di cache di suatu tempat dan baru saja diambil?
Jawaban:
Nah, kita bisa lihat sumbernya:
/ext/standard/array.c
PHP_FUNCTION(count)panggilan php_count_recursive(), yang pada gilirannya memanggil zend_hash_num_elements()larik non-rekursif, yang diimplementasikan dengan cara ini:
ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
IS_CONSISTENT(ht);
return ht->nNumOfElements;
}
Jadi Anda bisa lihat, ini O(1)untuk $mode = COUNT_NORMAL.
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.
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,
$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
foo($array[$i]);
}
Selain itu, Anda tidak selalu bisa memastikan countdipanggil dalam array. Jika dipanggil pada objek yang mengimplementasikan Countablemisalnya, countmetode objek itu akan dipanggil.
the count method of that object will be called, dapatkah Anda menjelaskan sedikit tentang ini
Countableantarmuka, maka pemanggilan count($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 onePernyataan ini bisa saja salah. Jika Anda melakukan traversal manual, itu adalah O(n)operasi. Tetapi jika Anda hanya ingin mengambil nilai yang telah dihitung sebelumnya, maka operasinya adalah O(1).