PHP的count()函数是否为数组的O(1)或O(n)?

Dex*_*ter 91 php arrays performance

是否count()真的计算了PHP数组的所有元素,或者这个值是否缓存在某处并且只是被检索?

Vla*_*sny 124

好吧,我们可以看一下来源:

__PRE__

PHP_FUNCTION(count)调用php_count_recursive(),它反过来调用zend_hash_num_elements()非递归数组,这是通过这种方式实现的:

/ext/standard/array.c

所以你可以看到,它是O(1)为了$mode = COUNT_NORMAL.

  • 不能错过为在PHP的源代码中寻找答案的人投票:) (9认同)
  • 但是`IS_CONSISTENT(ht)`做了什么? (6认同)
  • @Matt我正在检查哈希结构是否有效.它在zend_hash.c中定义,它也是O(1). (3认同)

jbe*_*erg 7

在PHP 5+中,长度存储在数组中,因此每次都不进行计数.

编辑:你也可能会发现这个分析很有趣:PHP计数性能.虽然数组的长度是由数组维护的,但是如果要count()多次调用它仍然可以更快地保持它.


mfo*_*nda 6

PHP 在内部存储数组的大小,但您仍然会进行函数调用,这比不进行函数调用要慢,因此,如果您正在执行诸如在环形:

例如,

$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
   foo($array[$i]);
}
Run Code Online (Sandbox Code Playgroud)

此外,您不能总是确定count正在对数组进行调用。Countable例如,如果在实现的对象上调用它,count则将调用该对象的方法。