3 回答

TA贡献1876条经验 获得超5个赞
哪个更快:isset()vsin_array()
isset() 是比较快的。
显而易见,isset()仅测试单个值。而in_array()将遍历整个数组,测试每个元素的值。
粗略的基准测试很容易使用microtime()。
结果:
Total time isset(): 0.002857
Total time in_array(): 0.017103
注意:无论是否存在,结果都是相似的。
码:
<?php
$a = array();
$start = microtime( true );
for ($i = 0; $i < 10000; ++$i) {
isset($a['key']);
}
$total_time = microtime( true ) - $start;
echo "Total time: ", number_format($total_time, 6), PHP_EOL;
$start = microtime( true );
for ($i = 0; $i < 10000; ++$i) {
in_array('key', $a);
}
$total_time = microtime( true ) - $start;
echo "Total time: ", number_format($total_time, 6), PHP_EOL;
exit;

TA贡献1804条经验 获得超2个赞
使用isset()可以提高查找速度,因为它使用哈希表,从而避免了O(n)搜索。
首先使用djb哈希函数对密钥进行哈希处理,以确定中类似哈希密钥的存储桶O(1)。然后重复搜索该存储桶,直到在中找到确切的密钥O(n)。
除非有任何有意的哈希冲突,这种方法产生的性能要比更好in_array()。
请注意,isset()按照显示的方式使用时,将最终值传递给另一个函数需要使用array_keys()创建一个新数组。通过将数据存储在键和值中,可能会造成内存折衷。
更新资料
查看代码设计决策如何影响运行时性能的好方法,可以查看脚本的编译版本:
echo isset($arr[123])
compiled vars: !0 = $arr
line # * op fetch ext return operands
-----------------------------------------------------------------------------
1 0 > ZEND_ISSET_ISEMPTY_DIM_OBJ 2000000 ~0 !0, 123
1 ECHO ~0
2 > RETURN null
echo in_array(123, $arr)
compiled vars: !0 = $arr
line # * op fetch ext return operands
-----------------------------------------------------------------------------
1 0 > SEND_VAL 123
1 SEND_VAR !0
2 DO_FCALL 2 $0 'in_array'
3 ECHO $0
4 > RETURN null
不仅in_array()使用效率相对较低的O(n)搜索,还需要将其称为函数(DO_FCALL),而为此isset()使用单个操作码(ZEND_ISSET_ISEMPTY_DIM_OBJ)。
添加回答
举报