翻了下PHP内核的定义,大概心中也有了答案了
count()
和strlen()
都是O(1)的时间复杂度
试想一下如果strlen()
需要O(N)的复杂度那未免也太慢了,字符串长度起来的话服务器不是要直接挂掉吗
这两个函数都是典型的空间换时间的做法
我们可以先看看zvalue的结构:
|
|
这里用的是一个联合体,当变量类型是string类型的时候附加存储多了一个len的整型变量,显而易见需要取长度直接利用记录值就可以了,自然就是O(1)
对于count()
常用的参数类型应该为数组,对于继承Countable的类暂不作讨论
数组实现方式为Hashtable,直接看看他的结构吧
|
|
count直接获取nNumOfElements大小,所以也是O(1)
后记补充————————————————
count() 函数的定义在这里
|
|
如果没有特别指定mode参数为 COUNT_RECURSIVE
的话(即作遍历),跳转到 zend 的数组计数函数 zend_array_count()
|
|
IS_REFERENCE:间接 zval 指的就是其真正的值是存储在其他地方的。注意这个 IS_REFERENCE 类型是不同的,间接 zval 是直接指向另外一个 zval 而不是像 zend_reference 结构体一样嵌入 zval。
只有当数组中有 HASH_FLAG_HAS_EMPTY_IND 这个 flag 时(间接zval)才会对数组进行遍历校验,其他情况下都是直接取 数组(hash table) 里面的 nNumOfElements 的值,答案显而易见了, count()
的时间复杂度就是O(1)