PHP тормозит str_replace

123 4
LEOnidUKG
На сайте с 25.11.2006
Offline
1723
1606

Писал я себе код и решил проверить скорость работы str_replace и preg_replace. Многие же писали, что регулярки тормознее.

Запилил тест и был в шоке, на последней версии PHP 8... str_replace ТОРМОЗИТ! При чём в два раза медленее. 

Переключился на PHP 7.4 тоже самое o_O

Мой выдуманный код для проверки в цикле 25 000 раз:

https://sandbox.onlinephpfunctions.com/code/d5db0a28a4c3a01981f277d118bd764bf60a7791

С версии 7.3 скорость str_replace упала или наборот, регулярные выражения так сильно вытянули по скорости и оптимизировали, что обычная функция работает медленее!

PHP Sandbox, test PHP online, PHP tester
  • sandbox.onlinephpfunctions.com
You can test your PHP code here on many php versions. Notes This script works with a whitelist of functions. All functions that do not require disk, system or network access are whitelisted, others...
✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#1

А ещё словил момент, что если добавлять в замену "\r\n" или элемент массива, str_replace может вообще в 6-ть раз медленнее. 

Это тестирование с рабочего скрипта, также в цикле 25 000 раз:

preg_replace: 0.1882 


str_replace: 2.0165
vitor
На сайте с 16.05.2009
Offline
225
#2
LEOnidUKG :

Писал я себе код и решил проверить скорость работы str_replace и preg_replace. Многие же писали, что регулярки тормознее.

Запилил тест и был в шоке, на последней версии PHP 8... str_replace ТОРМОЗИТ! При чём в два раза медленее. 

Переключился на PHP 7.4 тоже самое o_O

Мой выдуманный код для проверки в цикле 25 000 раз:

https://sandbox.onlinephpfunctions.com/code/d5db0a28a4c3a01981f277d118bd764bf60a7791

С версии 7.3 скорость str_replace упала или наборот, регулярные выражения так сильно вытянули по скорости и оптимизировали, что обычная функция работает медленее!


Если тестить на 7.2, то видно как скорость str_replace осталась ~ на прежнем уровне, а preg_replace выросла почти втрое. Что конечно очень странно, и больше похоже на баг.

7.2.3

preg_replace:   0.1255<hr>
preg_replace i: 0.1222<hr>
str_replace:    0.0781

8

preg_replace:   0.0399<hr>
preg_replace i: 0.0451<hr>
str_replace:    0.0841
LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#3
Если тестить на 7.2
Всё так, а если уже выбрать 7.3, то тут начинаются тормоза какие-то.
D
На сайте с 28.06.2008
Offline
1101
#4

Походу старый баг именно  str_replace, вон 11 лет назад тоже обсуждают https://www.linux.org.ru/forum/development/5591142

ответ вероятно в этом, цитирую

"Если же посмотреть на php_str_replace_in_subject() в ext/standard/string.c (фактически это и есть реализация str_replace()), она проходит по всему массиву $search и для каждого его элементы вызывает php_str_to_str_ex(), которая каждый раз просматривает строку заново"

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#5
Dram #:
Походу старый баг именно  str_replace, вон 11 лет назад тоже обсуждают https://www.linux.org.ru/forum/development/5591142

Не нашёл сразу эту старую тему.

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

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#6
Ещё нашёл закономерность, как только данных для замены становиться более ~150 символов, str_replace начинает деградировать. При чём  в сумме символов поиск+замена.
A
На сайте с 17.01.2019
Offline
19
#7
В 7.3 поменяли движок регулярок, почитайте заметки к обновлению 7.3. Я вот в yii2 как-то давно ловил из-за этого странную багу: https://arutyunov.me/blog/php/oshibka-v-regulyarnyh-vyrazheniyah-routov-yii2-v-php7-3/.
Ошибка в регулярных выражениях роутов Yii2 в PHP7.3. Обновление PCRE на PCRE2.
Ошибка в регулярных выражениях роутов Yii2 в PHP7.3. Обновление PCRE на PCRE2.
  • голосов: 3
  • 2019.10.03
  • Об авторе Кирилл Арутюнов Разрабатываю сайты и онлайн-сервисы, использую для этого Laravel, Vue, WordPress. Люблю своё дело и занимаюсь этим уже больше 8 лет. Сделаю ваш проект — пишите ! Если вы разработчик, то подписывайтесь на  фейсбук и ...
  • arutyunov.me
Недавно занимался отладкой старого приложения на Yii2 и встретил странную ошибку: Понятно: что-то не так с роутами в конфигах. Отследил, с какими конкретно роутами проблема, и вот что оказалось: Дело в том, что в PHP7.3 обновился движок регулярных выражений с PCRE на PCRE2. Вот выдержка из списка обновлений PHP7.3: With set, escape sequences...
Delysid
На сайте с 27.05.2019
Offline
131
#8
LEOnidUKG :

Писал я себе код и решил проверить скорость работы str_replace и preg_replace. Многие же писали, что регулярки тормознее.

Запилил тест и был в шоке, на последней версии PHP 8... str_replace ТОРМОЗИТ! При чём в два раза медленее. 

Переключился на PHP 7.4 тоже самое o_O

Мой выдуманный код для проверки в цикле 25 000 раз:

Я как понял тема создана показать какой вы профессионал? Окей?

Другие вопросы:

Почему вы в цикле проверяете время выполнения? (это не достойно тестера)

Сколько затрачивается миллисекунд на выполнение одного пустого цикла?

Почему вы приводите пример и выполняете проверку на сайте который изначально перегружен?

Напишите скрипт нормально и дополните с картинками - сколько миллисекунд требуется для 1 команды на вашей VPS.

W1
На сайте с 22.01.2021
Offline
285
#9
Delysid #:
Я как понял тема создана показать какой вы профессионал?

Нет. Для того, чтобы ты влез со своим флудом.

Мой форум - https://webinfo.guru –Там я всегда на связи
Delysid
На сайте с 27.05.2019
Offline
131
#10
webinfo #:
Нет. Для того, чтобы ты влез со своим флудом.

Доколи это терпеть то? Ну это же наживка для не понимающих... Я считаю создал тему, грамотно создай..

И по теме лучше со мной дальше не спорить т.к с этими циклами и не корректными запросами к str_replace могу стереть в порошок..

123 4

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