PHP场景下如何高效检查数组中值的存在?大数组性能及引入疑问
咱们来逐个拆解你遇到的这些PHP性能细节问题,都是实际开发里常碰到的点:
完全不用太担心。假设每个元素是类似$set[] = 'abc123';的写法,平均每行大概20-30字节,5000行加起来也就100KB-150KB左右,这个大小连普通图片的零头都不到,服务器读取和传输这种小文件毫无压力。
PHP的数组是哈希表结构,每个元素除了存值本身,还要额外存储键、哈希值等元数据。不过实际测算下来,5000个短字符串元素的数组,内存占用大概在500KB到1MB之间——这和PHP默认128MB的内存限制比起来,完全是九牛一毛,不会成为性能瓶颈。
in_array()更高效的查找方式 in_array()是线性遍历查找,时间复杂度是O(n),5000个元素其实也挺快,但如果要进一步优化,最直接的办法是把数组改成键值映射形式:
// 生成的数组改成这样 $set = array( 'foo' => true, 'bar' => true, // ... 剩下4998个元素 );
之后用isset($set[$value])或者array_key_exists($value, $set)来判断存在性——这两个都是哈希表直接查找,时间复杂度O(1),比in_array()快得多,尤其是频繁进行查找操作时,优化效果会很明显。
require的开销主要在第一次加载的文件读取和PHP代码编译环节。5000行的代码编译时间其实很短,毫秒级别就能完成。如果你的服务器开启了OPcache(现在PHP环境几乎都默认开启),那第二次及以后加载时,会直接复用缓存的 opcode,几乎没有额外开销。就算没开OPcache,这点编译时间对整体性能的影响也可以忽略不计。
额外提一句:因为你受限制必须用文件包含的方式,那上面的键值数组优化是最优解——既大幅提升查找效率,甚至还能稍微缩小一点文件体积(毕竟每行少写了$set[] = )。
内容的提问来源于stack exchange,提问作者Deane

