Является ли функция count () PHP O(1) или O (n) для массивов?


тут count() действительно подсчитайте все элементы массива PHP, или это значение кэшируется где-то и просто извлекается?

3 81

3 ответа:

Ну, мы можем посмотреть на источник:

/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.

в PHP 5 + длина хранится в массиве, поэтому подсчет не выполняется каждый раз.

EDIT: вы также можете найти этот анализ интересным: производительность PHP Count. Хотя длина массива поддерживается массивом, все равно кажется, что он быстрее удерживается, если вы собираетесь вызвать count() много раз.

PHP хранит размер массива внутри, но вы все еще делаете вызов функции, когда он медленнее, чем не делает его, поэтому вы захотите сохранить результат в переменной, если вы делаете что-то вроде использования его в цикле:

например,

$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
   foo($array[$i]);
}

кроме того, вы не всегда можете быть уверены count вызывается в массиве. Если он вызывается на объект, который реализует Countable например,count будет вызван метод этого объекта.