Является ли функция count () PHP O(1) или O (n) для массивов?
тут count()
действительно подсчитайте все элементы массива PHP, или это значение кэшируется где-то и просто извлекается?
3 ответа:
Ну, мы можем посмотреть на источник:
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
будет вызван метод этого объекта.