count()
Действительно ли подсчитываются все элементы массива PHP, или это значение где-то кэшируется и просто извлекается?
php
arrays
performance
Декстер
источник
источник
Ответы:
Что ж, можем посмотреть исходник:
PHP_FUNCTION(count)
вызовыphp_count_recursive()
, которые, в свою очередь, вызываютzend_hash_num_elements()
нерекурсивный массив, который реализован следующим образом:Как видите, это
O(1)
для$mode = COUNT_NORMAL
.источник
IS_CONSISTENT(ht)
делать?В PHP 5+ длина хранится в массиве, поэтому подсчет не выполняется каждый раз.
РЕДАКТИРОВАТЬ: Вам также может показаться интересным этот анализ: Производительность подсчета PHP . Хотя длина массива поддерживается массивом, все же кажется, что быстрее удержать его, если вы собираетесь вызывать
count()
много раз.источник
PHP хранит размер массива внутри, но вы все равно вызываете функцию, когда это медленнее, чем ее не делать, поэтому вы захотите сохранить результат в переменной, если вы делаете что-то вроде использования ее в цикл:
Например,
Кроме того, вы не всегда можете быть уверены, что
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)
.