У меня есть «большой» массив строк, и мне нужно найти там элементы, содержимое которых задано строкой.
Во время тестов я заметил, что array_filter намного медленнее, чем foreach and 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 против 0,18. foreach + if быстрее в ~ 1.8.
Проверял на php5.6 и php7 на разных серверах. Цифры, конечно, разные, но множитель находится в пределах (1,7,2,1).
Почему array_filter медленнее? Думаю, должно быть, по крайней мере, так же. Или даже быстрее за счет оптимизации под конкретную задачу.
Есть ли способ увеличить скорость? Может я что-то не так делаю в array_filter ()
Уважаемый заметил. Дело не в strpos, функция для проверки должна быть другой.
Данные не в MySQL или другом, они поступают один раз и нуждаются в однократной проверке как можно быстрее. Хранение в БД, индексация и т. д. Увеличит время выполнения всей задачи.
Дело не в изменении всего массива. Просто нахожу несколько элементов. Обычно более 10.
Также разница тем больше, чем больше найденных элементов.
Речь идет только о том, как улучшить производительность поиска (array_filter).
дело не в изменении всех ценностей. Просто нахожу несколько. @AlivetoDie Я пробовал preg_match ("|". $ Q. "|", $ Val), даже fnmatch - оба работают медленнее, но foreach еще быстрее. Может быть, что-то в синтаксисе функции обратного вызова.






похоже, что перегрузка функции обратного вызова делает ее медленной. Но я не слишком уверен