Какой метод предпочтительнее strstr или strpos?
Я заметил, что многие разработчики используют как strstr, так и strpos для проверки существования подстроки. Является ли один из них предпочтительным и почему ?
5 ответов:
из PHP онлайн руководство:
Если вы только хотите определить, если a определенная игла происходит внутри сена, используйте быстрее и меньше функция памяти интенсивная strpos() вместо.
здесь есть некоторые другие ответы (+бенчмарки), которые я получил на свой вопрос, который почти то же самое (я не понял Ваш, когда спрашивал).
тем временем я также сделал свой собственный тестовый тест, который я провел 1000000 раз для каждой соответствующей функции (
strstr()
,strpos()
,stristr()
иstripos()
).
Вот код:<?php function getmicrotime() { list($usec, $sec) = explode(" ", microtime()); return ((float) $usec + (float) $sec); } $mystring = 'blahblahblah'; $findme = 'bla'; echo 'strstr & strpos TEST:<pre>'; $time_start = getmicrotime(); for($i=0; $i<1000000; $i++) strstr($mystring, $findme); $time_needed_strstr = getmicrotime() - $time_start; echo 'strstr(): ', round( $time_needed_strstr , 8 ). PHP_EOL; $time_start = getmicrotime(); for($i=0; $i<1000000; $i++) stristr($mystring, $findme); $time_needed_stristr = getmicrotime() - $time_start; echo 'stristr(): ', round( $time_needed_stristr , 8 ) . PHP_EOL; $time_start = getmicrotime(); for($i=0; $i<1000000; $i++) strpos($mystring, $findme) !== false; $time_needed_strpos = getmicrotime() - $time_start; echo 'strpos() !== false: ', round( $time_needed_strpos , 8 ) . PHP_EOL; $time_start = getmicrotime(); for($i=0; $i<1000000; $i++) stripos($mystring, $findme) !== false; $time_needed_stripos = getmicrotime() - $time_start; echo 'stripos() !== false: ', round( $time_needed_stripos , 8 ) . PHP_EOL; echo PHP_EOL; echo 'time_needed_stristr - time_needed_strstr: ', round( $time_needed_stristr - $time_needed_strstr , 8) . PHP_EOL; echo 'time_needed_stripos - time_needed_strpos: ', round( $time_needed_stripos - $time_needed_strpos , 8) . PHP_EOL; echo PHP_EOL; echo 'time_needed_strstr - time_needed_strpos: ', round( $time_needed_strstr - $time_needed_strpos , 8) . PHP_EOL; echo 'time_needed_stristr - time_needed_stripos: ', round( $time_needed_stristr - $time_needed_stripos , 8) . PHP_EOL; echo '</pre>'; ?>
и вот первый вывод, который показывает, что
strpos()
is победитель:strstr & strpos TEST: strstr(): 2.39144707 stristr(): 3.65685797 strpos() !== false: 2.39055395 stripos() !== false: 3.54681897 time_needed_stristr - time_needed_strstr: 1.2654109 time_needed_stripos - time_needed_strpos: 1.15626502 time_needed_strstr - time_needed_strpos: 0.00089312 time_needed_stristr - time_needed_stripos: 0.110039
следующий похож на первый вывод (
strpos()
снова победитель):strstr & strpos TEST: strstr(): 2.39969015 stristr(): 3.60772395 strpos() !== false: 2.38610101 stripos() !== false: 3.34951186 time_needed_stristr - time_needed_strstr: 1.2080338 time_needed_stripos - time_needed_strpos: 0.96341085 time_needed_strstr - time_needed_strpos: 0.01358914 time_needed_stristr - time_needed_stripos: 0.25821209
Ниже Еще один, который более интересен, потому что в этом случае
strstr()
победитель:strstr & strpos TEST: strstr(): 2.35499191 stristr(): 3.60589004 strpos() !== false: 2.37646604 stripos() !== false: 3.51773095 time_needed_stristr - time_needed_strstr: 1.25089812 time_needed_stripos - time_needed_strpos: 1.14126492 time_needed_strstr - time_needed_strpos: -0.02147412 time_needed_stristr - time_needed_stripos: 0.08815908
это значит это действительно может зависеть от "экологической ситуации", которые иногда трудно повлиять, и может изменить результат "микро оптимизационных задач", как это, в случае, если вы просто проверяете существует ли строка в другой или нет.
но я думаю, что в большинстве случаев,
strpos()
победитель по сравнению сstrstr()
.Я надеюсь, что этот тест был полезен для кого-то.
многие разработчики используют
strpos
на микро-оптимизации целей.используя
strstr
также работает только в том случае, если результирующая строка не может быть интерпретирована как false в логическом контексте.
strpos () определяет, где в стоге сена лежит конкретная игла. stristr () проверяет, находится ли Игла где-нибудь в стоге сена
поэтому strpos () быстрее и меньше памяти потребляет
причина для strstr (): если ваша игла находится в начале строки, strpos возвращает 0 (поэтому нужно проверить его с помощью = = = false)