Каков самый быстрый способ найти появление строки в другой строке?

Возможный дубликат:
Какой метод является предпочтительным strstr или strpos?

Здравствуй!

Не могли бы вы сказать мне, какой из них быстрее :
strstr ($mystring, $findme);
ИЛИ
strpos ($mystring, $findme);
ИЛИ
что-нибудь еще
в поиске – первого или любого – вхождения строки в другую?

Это даже имеет значение в производительности, если я проверю возникновение в режиме без stristr() регистра с помощью stristr() ИЛИ stripos() ?

В моем случае не имеет значения, в какой точной позиции данная строка (если она есть) или сколько раз она встречается в другой (если она есть), остается только важный вопрос, если она существует даже в другой строке.

Я уже нашел несколько комментариев о различиях в скорости в разных статьях (например, на php.net , кто-то говорит, что strstr () быстрее, если есть ошибка! == false после strpos), но теперь я не могу решить, какие правда.

Если вы знаете о каких-либо лучших методах поиска строки в другой, пожалуйста, дайте мне знать!

Большое спасибо за соответствующие комментарии!

============

Пример:

$mystring = 'blahblahblah'; $findme = 'bla'; if(strstr($mystring, $findme)){ echo 'got it'; } else{ echo 'none'; } echo PHP_EOL; if(strpos($mystring, $findme) !== false){ echo 'got it'; } else{ echo 'none'; }
$mystring = 'blahblahblah'; $findme = 'bla'; if(strstr($mystring, $findme)){ echo 'got it'; } else{ echo 'none'; } echo PHP_EOL; if(strpos($mystring, $findme) !== false){ echo 'got it'; } else{ echo 'none'; } 

strpos кажется, лидирует, я протестировал его, найдя некоторые строки в 'The quick brown fox jumps over the lazy dog' :

  • strstr используется 0,48487210273743 микросекунды для 1000000 итераций,
  • strpos использовали 0.40836095809937 микросекунды для 1000000 итераций, нашедших 'quick'
  • strstr используется 0,45261287689209 микросекунды для 1000000 итераций,
  • strpos использовали 0,39890813827515 микросекунды для 1000000 итераций, нашедших 'dog'
 <?php $haystack = 'The quick brown fox jumps over the lazy dog'; $needle = 'quick'; $iter = 1000000; $start = microtime(true); for ($i = 0; $i < $iter; $i++) { strstr($haystack, $needle); } $duration = microtime(true) - $start; echo "<br/>strstr used $duration microseconds for $iter iterations finding 'quick' in 'The quick brown fox jumps over the lazy dog'"; $start = microtime(true); for ($i = 0; $i < $iter; $i++) { strpos($haystack, $needle); } $duration = microtime(true) - $start; echo "<br/>strpos used $duration microseconds for $iter iterations finding 'quick' in 'The quick brown fox jumps over the lazy dog'"; $needle = 'dog'; $start = microtime(true); for ($i = 0; $i < $iter; $i++) { strstr($haystack, $needle); } $duration = microtime(true) - $start; echo "<br/>strstr used $duration microseconds for $iter iterations finding 'dog' in 'The quick brown fox jumps over the lazy dog'"; $start = microtime(true); for ($i = 0; $i < $iter; $i++) { strpos($haystack, $needle); } $duration = microtime(true) - $start; echo "<br/>strpos used $duration microseconds for $iter iterations finding 'dog' in 'The quick brown fox jumps over the lazy dog'"; ?> 

Из документов PHP :

Заметка:

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

Я готов заверить их за это 🙂

Более быстрый способ:

 if (strpos($haystack, $needle) !== false) 

Нечувствительные к регистру версии должны, очевидно, быть медленнее (по крайней мере, в два раза медленнее, я ожидаю).


strncmp() / substr() может работать лучше, если вы проверяете, стоит ли $haystack с $needle и если $haystack значительно длиннее (> сотни символов или около того).


Ориентир:

  • strpos () против strncmp () = short | длинный

См. Другие тесты @ http://net-beta.net/ubench/ (поиск strpos ).


Приватный пример, когда такие виды оптимизации (вид) имеют значение – вычисление хэш-сигналов :

 $count = 0; $hashcash = sprintf('1:20:%u:%s::%u:', date('ymd'), $to, mt_rand()); while (strncmp('00000', sha1($hashcash . $count), 5) !== 0) { ++$count; } $header['X-Hashcash'] = $hashcash . $count; 

Согласно файлам php, strpos быстрее и меньше памяти, чем strstr.

Хитрый вопрос. Они делают две разные вещи. Один возвращает подстроку, другой возвращает исходную позицию подстроки с строкой. Реальный ответ: вы сравниваете яблоки с апельсинами, используйте тот, который вам нужен.

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

Я бы подумал, что strpos() будет быстрее, потому что он возвращает целое число (или false если совпадение не найдено). strstr() возвращает строку, содержащую весь текст после первого включения.

Для случаев, нечувствительных к регистру, я бы подумал, что они будут немного медленнее, потому что они должны выполнять дополнительные проверки («не совпадают ли два символа?», Если нет, является ли символ буквой? Если да, соответствует ли это нижней строчной версии? , соответствует ли это версии в верхнем регистре? "и т. д.),