Я искал некоторую информацию о производительности регулярных выражений - поскольку мне нужно много раз искать - и правда в том, что зависит от того, чего вы хотите достичь . Для своих целей я протестировал один тип поиска для сравнения производительности.
Спецификация:
Мне нужно найти простую строку в массиве строк.
Для тестирования у меня есть $testArray
, который представляет собой массив из ~ 11k многословных фраз, собранных из статьи о Толкине (например, строки «История повелителя колец», «Кристофер Толкиен»).
Поскольку я хочу найти только фразы, содержащие точное слово, я не могу использовать функцию strpos()
, например. при поиске «ring» он также находит фразы со словом «ringtone».
Код с использованием функций php:
$results = array();
$searchWord = 'rings';
foreach ($testArray as $phrase){
$phraseArr = explode(' ', $phrase);
if(in_array($searchWord, $phraseArr)){
$results[] = $phrase;
}
}
Код с использованием функции регулярного выражения:
$results = array();
$pattern= "/( |^)rings( |$)/";
$results = preg_grep($pattern, $testArray);
Я обнаружил, что в этом случае функция регулярного выражения была примерно в 10 раз быстрее
Время выполнения для 100 поисковых запросов было (с использованием различных слов)
- от 0,3436 до 0,3468 секунды для функций php
- от 0,0332 до 0,0406 секунды для регулярных выражений
Такой поиск может быть тривиальным, но для более сложных задач я предполагаю, что было бы чрезвычайно трудно / невозможно реализовать его без регулярных выражений только для нативных функций php.
В заключение : для простых задач вы должны использовать регулярное выражение, потому что это будет вероятно быстрее, а для сложных задач вы вероятно должны использовать регулярное выражение, потому что это будет единственным способом решить проблему.
Edit:
Я просто понимаю, что эта тема о "функциях PHP string ", и мой тестовый код использует функции explode()
и in_array()
. Поэтому я попробовал другой подход. Поскольку мой разделитель - пробел, метод поиска ниже также работает и использует функцию strpos()
.
Код с использованием функции strpos()
:
$results = array();
$searchWord = 'rings';
foreach ($testArray as $phrase){
if(strpos(' ' . $phrase . ' ', ' ' . $searchWord . ' ')!==FALSE){
$results[] = $phrase;
}
}
Но все же результаты были намного хуже, чем в случае с регулярными выражениями.
Итак сводка производительности это:
- от 0,3436 до 0,3468 секунды для функций массива php
- от 0.2001 до 0,2273 секунды для
strpos()
функции
- от 0,0332 до 0,0406 секунды для регулярного выражения
Все еще регулярное выражение - большой победитель.