Холивар на тему - что быстрее ищет по строке PHP ?

D
На сайте с 28.06.2008
Offline
1104
583

По модной традиции, просил сперва у GPT ))

Какая из этих функций PHP быстрее всего делает поиск по строке. 1. strstr 2. strpos 3. preg_match 4. str_contains Расположи в порядке убывания скорости и оцени примерно в процентах их скорость, если у первого места скорость будет = 100%

GPT:

По скорости выполнения в порядке убывания скорости это будет выглядеть так:

  1. preg_match (100%)
  2. strstr (50%)
  3. strpos (30%)
  4. str_contains (10%)

Спросил еще раз, ответ уже другой


Скорость поиска по строке PHP функций в порядке убывания будет:

1. str_contains

2. strpos

3. strstr

4. preg_match

Оценить скорость в процентах сложно, так как она зависит от объема и состава обрабатываемых данных, но примерно можно сказать, что str_contains быстрее strstr на 20-30%, strpos быстрее strstr на 5-10%, а preg_match медленнее всех на 50-100%.


Что-то мне кажется моросит она )) по идее самым быстрым должен быть strpos, но мне непонятно почему PHPStorm рекомендует для PHP8 заменить ее на  str_contains

W1
На сайте с 22.01.2021
Offline
305
#1
Dram :
по идее самым быстрым должен быть strpos

Тут как-то давно на сёрче прозвучало, что, начиная с РНР 7, функции с использованием регулярных выражений удалось оптимизировать настолько , что в некоторых случаях они стали работать быстрее строковых.

Но никто не мешает проверить это самостоятельно.

Мой форум - https://webinfo.guru –Там я всегда на связи
D
На сайте с 28.06.2008
Offline
1104
#2

Проверил на пхп 7.4

$search_word = 'dfhggdfhdfhfdghert';
$file = file_get_contents('/var/www/com/12.txt');
// Пример с использованием  strstr
$start_time_strstr = microtime(true);
$found_strstr = strstr($file, $search_word);
$end_time_strstr = microtime(true);

// Пример с использованием strpos
$start_time_strpos = microtime(true);
$found_strpos = strpos($file, $search_word);
$end_time_strpos = microtime(true);

// Пример с использованием preg_match
$start_time_preg_match = microtime(true);
$found_preg_match = preg_match('/' . $search_word . '/', $file);
$end_time_preg_match = microtime(true);

// Вывод результатов

echo "Скорость поиска по слову '".$search_word."'\n";
echo "strstr(): " . number_format(($end_time_strstr - $start_time_strstr), 10) . " ms\n";
echo "strpos(): " . number_format(($end_time_strpos - $start_time_strpos), 10) . " ms\n";
echo "preg_match(): " . number_format(($end_time_preg_match - $start_time_preg_match), 10) . " ms\n";

Ожидаемо -  strpos быстрее всего.

LEOnidUKG
На сайте с 25.11.2006
Offline
1745
#3
webinfo #:

Тут как-то давно на сёрче прозвучало, что, начиная с РНР 7, функции с использованием регулярных выражений удалось оптимизировать настолько , что в некоторых случаях они стали работать быстрее строковых.

Но никто не мешает проверить это самостоятельно.

Это я писал в теме и тестировал: 

https://searchengines.guru/ru/forum/1048944

Сам всегда использую регулярку, никогда не было проблем со скоростью, зато универсально и не надо потом ВДРУГ менять код т.к. поменялись условия.

PHP тормозит str_replace - Веб-строительство - Сайтостроение - Форум об интернет-маркетинге
PHP тормозит str_replace - Веб-строительство - Сайтостроение - Форум об интернет-маркетинге
  • 2023.03.24
  • searchengines.guru
Писал я себе код и решил проверить скорость работы replace. Мой выдуманный код для проверки в цикле 25 000 раз sandbox. то видно как скорость str replace выросла почти втрое. Может быть скоро str replace станет просто работать через модуль регулярных выражений
✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
T7
На сайте с 19.09.2018
Offline
63
#4
Dram #:
Ожидаемо -  strpos быстрее всего.

Очень правильный подход, поверить все самому.

Только добавьте  добавьте в тесты:

<?php
$test_contains = function ($s, $f){return str_contains($s, $f);};
$test_strstr = function ($s, $f){return strstr($s, $f) ? 1 : 0;};
$test_preg = function ($s, $f){return preg_match("&$f&", $s);};
$test_strpos = function ($s, $f){return strpos($s, $f);};

function __($cnt, $fu, $s, $f) {
    sleep(1);
    $start_time = microtime(1);
    for($i=0; $i<$cnt; ++$i) {
        $s = $s . $i;
        $r = $fu($s, $f);
    }        
    echo 'Time: ',
         number_format(microtime(1) - $start_time, 5),
         '; Mem: ', memory_get_usage(1), '/', memory_get_peak_usage(1),
         ', Last RES: ',  
         $r, "\n";
}

function test(int $cnt, callable $fu, string $test_name) {
    $data = file_get_contents('./12.txt');    
    echo "!!", $test_name, " / ", $cnt, " раз: ";    
    __($cnt, $fu, $data, 'dfhggdfhdfhfdghert');

}

echo "Test search:\n", PHP_VERSION, "\n";
echo ' Mem usage: ', memory_get_usage(1), '/', memory_get_peak_usage(1), "\n";
$c = 100000;
test($c, $test_contains, "test_contains");  
test($c, $test_preg, "test_preg");
test($c, $test_strstr, "test_strstr");
test($c, $test_strpos, "test_strpos");

Результат:


Когда 1 раз, то strpos быстрее, а когда много, то не очень. Но, это не точно

M2
На сайте с 27.12.2015
Offline
70
#5
timo-71 #:

Очень правильный подход, поверить все самому.

Только добавьте  добавьте в тесты:

Результат:


Когда 1 раз, то strpos быстрее, а когда много, то не очень. Но, это не точно

png pol6od_c57fsv_2023-03-26_184040.png
png u7cidr_jmbkb1_2023-03-26_184159.png
png s6i0wn_3gs5l5_2023-03-26_184237.png
png l1ua0t_327coo_2023-03-26_184317.png

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий