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 条评论