Какой метод предпочтителен strstr или strpos? - PullRequest
75 голосов
/ 28 апреля 2011

Я заметил, что многие разработчики используют как strstr, так и strpos для проверки существования подстроки. Один из них предпочтителен и почему?

Ответы [ 5 ]

116 голосов
/ 28 апреля 2011

Из PHP электронное руководство :

Если вы хотите только определить, является ли конкретная игла происходит внутри стог сена, используйте быстрее и меньше функция интенсивного использования памяти strpos() вместо этого.

33 голосов
/ 28 апреля 2011

Здесь - некоторые другие ответы (+ тесты), которые я получил на свой вопрос, который является почти таким же (я не понял ваш, когда спрашивал).


Тем временем я также провел свой собственный тест производительности, который я выполнял 1000000 раз для каждой соответствующей функции (strstr(), strpos(), stristr() и stripos()).
Вот код:

<code><?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 '
';?>

А вот первый вывод, который показывает, что strpos() является победителем :

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().

Я надеюсьэтот тест был полезен для кого-то.

6 голосов
/ 28 апреля 2011

Многие разработчики используют strpos для микрооптимизации целей.

Использование strstr также работает, только если результирующая строка не может быть интерпретирована как ложная в логическом контексте.

0 голосов
/ 19 декабря 2014

Я предпочитаю strstr() для удобства чтения и легкого кодирования. strpos() !==false немного сбивает с толку ..

0 голосов
/ 28 апреля 2011

strpos () определяет, где в стоге сена лежит конкретная игла.stristr () проверяет, находится ли игла где-нибудь в стоге сена.

, поэтому strpos () работает быстрее и требует меньше памяти

причина для strstr (): если ваша игла находится в началестрока, strpos возвращает 0 (поэтому нужно проверить это с === false)

...