当前位置:首页 > 叨叨念念 > PHP性能优化和in_array 、array_search、array_key_exists和isset性能比较

PHP性能优化和in_array 、array_search、array_key_exists和isset性能比较

叨叨念念 / 星之宇 / 2024-8-8 11:03 / 浏览:32 / 评论:0

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

    • 昵称
    • 邮箱
    • 网址