Почему мой array_filter () медленнее, чем foreach () и if ()?

У меня есть «большой» массив строк, и мне нужно найти там элементы, содержимое которых задано строкой.

Во время тестов я заметил, что 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).

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

Serving Quarantine period 16.03.2018 09:53

дело не в изменении всех ценностей. Просто нахожу несколько. @AlivetoDie Я пробовал preg_match ("|". $ Q. "|", $ Val), даже fnmatch - оба работают медленнее, но foreach еще быстрее. Может быть, что-то в синтаксисе функции обратного вызова.

ABelikov 16.03.2018 10:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
844
0

Другие вопросы по теме