PHP的count()函数O(1)或O(n)是否为数组?
count()
是否真的计算了一个PHP数组的所有元素,还是将这个值caching在某个地方而只是被获取?
那么,我们可以看看来源:
/ext/standard/array.c
PHP_FUNCTION(count)
调用php_count_recursive()
,它依次调用zend_hash_num_elements()
用于非recursion数组,这是通过以下方式实现的:
ZEND_API int zend_hash_num_elements(const HashTable *ht) { IS_CONSISTENT(ht); return ht->nNumOfElements; }
所以你可以看到,它是O(1)
$mode = COUNT_NORMAL
。
在PHP 5+中,长度存储在数组中,因此每次都不会进行计数。
编辑:你也可能会发现这个分析很有趣: PHP计数性能 。 虽然数组的长度是由数组维护的,但是如果要多次调用count()
,仍然可以保持它的速度。
PHP在内部存储了一个数组的大小,但是当它比没有创build一个数组要慢时,你仍然在进行一个函数调用,所以如果你正在做一些像在循环:
例如,
$cnt = count($array); for ($i =0; $i < $cnt; $i++) { foo($array[$i]); }
此外,您不能始终确保数组正在被调用。 例如,如果在实现Countable
的对象上调用该对象的count
方法,则会调用该对象的count
方法。