Чи count()
насправді підраховуються всі елементи масиву PHP, чи це значення десь кешоване і просто отримується?
Чи count()
насправді підраховуються всі елементи масиву PHP, чи це значення десь кешоване і просто отримується?
Відповіді:
Ну, ми можемо подивитися на джерело:
/ext/standard/array.c
PHP_FUNCTION(count)
виклики php_count_recursive()
, що в свою чергу викликає zend_hash_num_elements()
нерекурсивний масив, який реалізований таким чином:
ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
IS_CONSISTENT(ht);
return ht->nNumOfElements;
}
Тож ви бачите, це O(1)
для $mode = COUNT_NORMAL
.
IS_CONSISTENT(ht)
робити?
У PHP 5+ довжина зберігається в масиві, тому підрахунок не проводиться кожного разу.
РЕДАГУВАТИ: Цей аналіз вам також може стати цікавим: продуктивність підрахунку PHP . Незважаючи на те, що довжина масиву підтримується масивом, все одно здається, що швидше за нього втриматися, якщо ви збираєтеся телефонувати count()
багато разів.
PHP зберігає розмір масиву внутрішньо, але ви все одно здійснюєте виклик функції, коли повільніше, ніж не робити, тому вам захочеться зберегти результат у змінній, якщо ви робите щось на зразок використання в цикл:
Наприклад,
$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
foo($array[$i]);
}
Крім того, ви не завжди можете бути впевнені count
, що викликається масив. Якщо його викликають на об'єкті, який реалізує, Countable
наприклад, count
буде викликаний метод цього об'єкта.
the count method of that object will be called
, чи можете ви пояснити це трохи
Countable
інтерфейс, тоді виклик count($object)
- це те саме, що дзвінок $object->count()
. Дивіться, наприклад, 3v4l.org/oYSSC .
you're still making a function call when which is slower than not making one
Це твердження може бути помилковим. Якщо ви робите ручний обхід, це O(n)
операція. Але якщо ви просто хочете отримати заздалегідь обчислене значення, тоді це операція O(1)
.