это быстрый процесс strpos () / stripos () или preg_match () в php - PullRequest
4 голосов
/ 28 февраля 2012

Я просто хочу знать, какая из них будет быстрее функций strpos () / stripos () или preg_match () в php.

Ответы [ 3 ]

5 голосов
/ 26 октября 2015

Я нашел этот блог , который провел несколько тестов по вашему вопросу, результат был:

  • strpos () в 3-16 раз быстрее, чем preg_match ()
  • stripos () в 2-30 раз медленнее, чем strpos ()
  • stripos () на 20-100 процентов быстрее, чем preg_match () с модификатором без регистра "// i"
  • Использование регулярного выражения в preg_match () не быстрее, чем использование длинной строки
  • Использование модификатора utf8 "// u" в preg_match () делает его в 2 раза медленнее

Используемый код был:

<?php

function loop(){

$str_50 = str_repeat('a', 50).str_repeat('b', 50);
$str_100 = str_repeat('a', 100).str_repeat('b', 100);
$str_500 = str_repeat('a', 250).str_repeat('b', 250);
$str_1k = str_repeat('a', 1024).str_repeat('b', 1024);
$str_10k = str_repeat('a', 10240).str_repeat('b', 1024);
$str_100k = str_repeat('a', 102400).str_repeat('b', 1024);
$str_500k = str_repeat('a', 1024*500).str_repeat('b', 1024);
$str_1m = str_repeat('a', 1024*1024).str_repeat('b', 1024);

$b = 'b';
$b_10 = str_repeat('b', 10);
$b_100 = str_repeat('b', 100);
$b_1k = str_repeat('b', 1024);

echo str_replace(',', "\t", ',strpos,preg,preg U,preg S,preg regex,stripos,preg u,'.
  'preg i,preg u i,preg i regex,stripos uc,preg i uc,preg i uc regex').PHP_EOL;

foreach (array($b, $b_10, $b_100, $b_1k) as $needle) {
  foreach (array($str_50, $str_100, $str_500, $str_1k, $str_10k,
    $str_100k, $str_500k, $str_1m) as $str) {

    echo strlen($needle).'/'.strlen($str);

    $start = mt();
    for ($i=0; $i<25000; $i++) $j = strpos($str, $needle); // strpos
    echo "\t".mt($start);

    $regex = '!'.$needle.'!';
    $start = mt();
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg
    echo "\t".mt($start);

    $regex = '!'.$needle.'!U';
    $start = mt();
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg Ungreedy
    echo "\t".mt($start);

    $regex = '!'.$needle.'!S';
    $start = mt();
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg extra analysiS
    echo "\t".mt($start);

    $regex = "!b{".strlen($needle)."}!";
    $start = mt();
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg regex
    echo "\t".mt($start);

    $start = mt();
    for ($i=0; $i<25000; $i++) $j = stripos($str, $needle); // stripos
    echo "\t".mt($start);

    $regex = '!'.$needle.'!u';
    $start = mt();
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg utf-8
    echo "\t".mt($start);

    $regex = '!'.$needle.'!i';
    $start = mt();
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg i
    echo "\t".mt($start);

    $regex = '!'.$needle.'!ui';
    $start = mt();
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg i utf-8
    echo "\t".mt($start);

    $regex = "!b{".strlen($needle)."}!i";
    $start = mt();
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg i regex
    echo "\t".mt($start);

    echo PHP_EOL;
  }
  echo PHP_EOL;
}
}

function mt($start=null){
  if ($start === null) return microtime(true);
  return number_format(microtime(true)-$start, 4);
}

loop();
1 голос
/ 09 июня 2012

preg_match - самый медленный из трех.stripos будет медленнее, чем strpos, поскольку для обработки сопоставления без учета регистра потребуется дополнительная работа.

0 голосов
/ 16 марта 2012

Сравнительный анализ - сложная задача, но можно с уверенностью сказать, что preg_match медленнее, чем strpos или stripos. Это связано с тем, что функции PRCE реализуют механизм REGEX, который на намного более мощный и гибкий, чем строковые функции.

Они также делают разные вещи. strpos сообщит вам индекс начала строки внутри другой строки, тогда как preg_match в основном используется для проверки формата строки и получения ее разделов на основе регулярных выражений.

Короче говоря, если вы просто хотите найти строку внутри другой строки, используйте strpos или stripos.

...