我有一个“大”字符串数组,需要找到那些内容指定字符串的元素。
在测试期间,我注意到array_filter比“foreach和if”慢得多。
这是我的测试代码:
<?php
//Fill array for test by random string
$arr=array();
for($i=0;$i<1000000;$i++) $arr[]="str1".rand(0,999999)."str2";
//Search value
$q='555';
//Test search by foreach and if
$stime=microtime(true);
$res=array();
foreach ($arr as $key=>$val) {
if (strpos($val, $q) !== FALSE)
$res[$key]=$val;
}
//print_r($res);
echo "\n".(microtime(true)-$stime);
//Test search by array_filter
$stime=microtime(true);
$res = array_filter($arr, function ($val) use ($q) { return (strpos($val, $q) !== FALSE); } );
//print_r($res);
echo "\n".(microtime(true)-$stime);
0.10 vs 0.18。 foreach +如果在~1.8中更快。
我在不同服务器上的php5.6和php7上查了一下。数字当然不同,但乘数在范围内(1.7,2.1)。
为什么array_filter会变慢?我认为它必须至少相同。或者通过针对特定任务的优化更快。
还有提高速度吗? 也许我在array_filter()
中做得不好Pleace注意到了。 这不是关于strpos,检查的功能必须是另一个。
数据不在MySQL或其他,它来了一次,需要尽快检查一次。在数据库中存档,索引等会增加整个任务的时间。
这不是要改变整个阵列。只是找几个元素。通常超过10个。
如果finded元素的数量更大,也会有更大的差异。
这只是关于如何提高搜索性能(array_filter)。