|
总是使用isset和array_key_exists测试数组中的变量是否存在,然后忽然很想知道到底两者有什么区别,然后百度了一下,有说array_key_exists更快的——www.laohucheng.com/post/122/,也用说isset更快的,当然似乎更多人建议isset,记得什么时候在论坛中也看到有人提及,但是没找到了
于是自己做了一个测试,比较一下两者的差异
PHP复制代码
function issetVsArray ()
{
$loop = 10;
$test = array();
for( $i = 0; $i <= $loop; $i++)
{
$test['test'.$i] = $i;
}
$this->benchmark->mark('issetAllFalse');
for( $i = 0; $i<=$loop; $i++)
{
isset($test['t'.$i]);
}
$this->benchmark->mark('arraysAllFalse');
for( $i = 0; $i<=$loop; $i++)
{
array_key_exists('t'.$i,$test);
}
$this->benchmark->mark('issetAllTrue');
for( $i = 0; $i<=$loop; $i++)
{
isset($test['test'.$i]);
}
$this->benchmark->mark('arraysAllTrue');
for( $i = 0; $i<=$loop; $i++)
{
array_key_exists('test'.$i,$test);
}
$this->benchmark->mark('end');
echo $this->benchmark->elapsed_time('issetAllFalse','arraysAllFalse').'<br />';
echo $this->benchmark->elapsed_time('arraysAllFalse','issetAllTrue').'<br />';
echo $this->benchmark->elapsed_time('issetAllTrue','arraysAllTrue').'<br />';
echo $this->benchmark->elapsed_time('arraysAllTrue','end').'<br />';
}
复制代码
几次测试结果如下:
HTML复制代码
结果$loop=10
0.0001
0.0009
0.0001
0.0007
结果$loop=100
0.0003
0.0185
0.0003
0.0189
结果$loop=1000
0.0015
0.2831
0.0020
0.2839
结果$loop=10000
0.0157
8.4764
0.0164
8.4101
复制代码
测试环境:Apache/2.2.8 (Win32) SVN/1.6.6 mod_ssl/2.2.8 OpenSSL/0.9.8k PHP/5.2.6 DAV/2 Server 。
当数组个数为10时,两者差异就体现出来了——isset速度要快近10倍,但不是很明显,而且对于变量是否存在,两者之间的差异没有太大,当变量存在时运行更快,但是这种趋势在是非常微弱的。使用array_key_exists随着循环的次数增加,程序运行的时间增加量是成几何级数增加的,当一个数组元素个数超过1000时运行速度就非常慢了。
最后总结一下
- isset和array_key_exists在对判断一个数组函数中某个元素是否存在,isset速度要更快,而且这种速度差异是非常大的
- isset属于php中的语言结构,而后者是函数,所以前者更快,isset不可以用于可变函数
- 对于变量值的判断,当变量为NULL时,isset返回的结果是false,而后者只判断变量是否存在。所以如果判断一个数组中的某个元素,并且判断其是否是否为真,应该用isset
- isset属于php特定语言结构,后者在其他语言中也存在,更具可读性
参考
www.alternateinterior.com/2006/11/comparing-array_key_exists-with-isset.html |
|