PHP性能优化和in_array 、array_search、array_key_exists和isset性能比较
1个PHP项目中,需要在一个大数组中遍历查询是否存在该元素,使用了in_array()导致运行程序时快时慢。通过测试得知in_array()和array_search()在大数组查询越靠后的元素时速度越慢。而使用array_key_exists()或者isset()则会很快。因为这个函数需要用到key,所以使用array_flip()反转/交换数组中所有的键名以及它们关联的键值。
1、测试环境
PHP 8.3.7和阿里云99元云主机。
2、测试数据
10万元素的数组,以及要查询的值分别对应数组第100个元素,第1万个元素和第10万个元素。
for($i=0;$i<100000;$i++){
$arr[$i] = md5('77bx_'.$i);
}
$a = md5('77bx_99');
$b = md5('77bx_9999');
$c = md5('77bx_99999');
3、执行结果
3.1 in_array执行结果
$start = microtime(1);
for ($i = 0; $i < 1000; $i++) {
in_array($a, $arr);
}
$end = microtime(1);
$finished = $end - $start;
echo "in_array 第100个元素1000次耗时{$finished}\r\n";
$start = microtime(1);
for ($i = 0; $i < 1000; $i++) {
in_array($b, $arr);
}
$end = microtime(1);
$finished = $end - $start;
echo "in_array 第10000个元素1000次耗时{$finished}\r\n";
$start = microtime(1);
for ($i = 0; $i < 1000; $i++) {
in_array($c, $arr);
}
$end = microtime(1);
$finished = $end - $start;
echo "in_array 第100000个元素1000次耗时{$finished}\r\n";
in_array 第100个元素1000次耗时0.0020701885223389
in_array 第10000个元素1000次耗时0.049629926681519
in_array 第100000个元素1000次耗时2.4181280136108
要查询的值越靠后运行时间越长,2.4秒已经影响体验了。
3.2 array_search执行结果
$start = microtime(1);
for ($i = 0; $i < 1000; $i++) {
array_search($a, $arr);
}
$end = microtime(1);
$finished = $end - $start;
echo "array_search 第100个元素1000次耗时{$finished}\r\n";
$start = microtime(1);
for ($i = 0; $i < 1000; $i++) {
array_search($b, $arr);
}
$end = microtime(1);
$finished = $end - $start;
echo "array_search 第10000个元素1000次耗时{$finished}\r\n";
$start = microtime(1);
for ($i = 0; $i < 1000; $i++) {
array_search($c, $arr);
}
$end = microtime(1);
$finished = $end - $start;
echo "array_search 第100000个元素1000次耗时{$finished}\r\n";
array_search 第100个元素1000次耗时0.0021288394927979
array_search 第10000个元素1000次耗时0.046977996826172
array_search 第100000个元素1000次耗时3.0288410186768
跟上述in_array相比,甚至更耗时间。
3.3 array_key_exists执行结果
$start = microtime(1);
$flipArr = array_flip($arr);
for ($i = 0; $i < 1000; $i++) {
array_key_exists($a, $flipArr);
}
$end = microtime(1);
$finished = $end - $start;
echo "array_key_exists 第100个元素1000次耗时{$finished}\r\n";
$start = microtime(1);
$flipArr = array_flip($arr);
for ($i = 0; $i < 1000; $i++) {
array_key_exists($b, $flipArr);
}
$end = microtime(1);
$finished = $end - $start;
echo "array_key_exists 第10000个元素1000次耗时{$finished}\r\n";
$start = microtime(1);
$flipArr = array_flip($arr);
for ($i = 0; $i < 1000; $i++) {
array_key_exists($c, $flipArr);
}
$end = microtime(1);
$finished = $end - $start;
echo "array_key_exists 第100000个元素1000次耗时{$finished}\r\n";
array_key_exists 第100个元素1000次耗时0.0087800025939941
array_key_exists 第10000个元素1000次耗时0.018564939498901
array_key_exists 第100000个元素1000次耗时0.020195007324219
虽然要查询的值(key)越靠后,但是增长不是太高,跟in_array相比快了差不多100倍。
3.4 isset执行结果
$start = microtime(1);
$flipArr = array_flip($arr);
for ($i = 0; $i < 1000; $i++) {
isset($flipArr[$a]);
}
$end = microtime(1);
$finished = $end - $start;
echo "isset 第100个元素1000次耗时{$finished}\r\n";
$start = microtime(1);
$flipArr = array_flip($arr);
for ($i = 0; $i < 1000; $i++) {
isset($flipArr[$b]);
}
$end = microtime(1);
$finished = $end - $start;
echo "isset 第10000个元素1000次耗时{$finished}\r\n";
$start = microtime(1);
$flipArr = array_flip($arr);
for ($i = 0; $i < 1000; $i++) {
isset($flipArr[$c]);
}
$end = microtime(1);
$finished = $end - $start;
echo "isset 第100000个元素1000次耗时{$finished}\r\n";
isset 第100个元素1000次耗时0.010703086853027
isset 第10000个元素1000次耗时0.010765790939331
isset 第100000个元素1000次耗时0.010534048080444
相比array_key_exists更快。
4、总结
4.1 小数组的查询性能:in_array > array_search > array_key_exists > isset
4.2 大数组的查询性能:isset > array_key_exists > in_array > array_search (也是优先建议使用方式,当然也可以按照实际情况使用)
目前有 0 条评论