PHP тормозит str_replace

1 234
WS
На сайте с 01.11.2008
Offline
135
#31
LEOnidUKG #:

А давайте ваш тест поменяем, чтобы для каждой функции будет свой текст и мы уберём в конце дублирование функции в конце. 

<?php


function get_time()

{

  $t=microtime();

  $t=explode(' ',$t);

  $t=(float)$t[1]+(float)$t[0];

  return $t;

}


$thisoutput=$thisoutput1=$thisoutput2=<<<EOF


</a></span></span><span class="tm-article-snippet__datetime-published"><time datetime="2021-07-17T11:55:11.000Z" title="2021-07-17, 14:55">сегодня в 14:55</time></span></div><!----></div><h1 lang="ru" class="tm-article-snippet__title tm-article-snippet__title_h1"><span>Google добавляет в Chrome режим HTTPS-First</span></h1><div class="tm-article-snippet__hubs"><span class="tm-article-snippet__hubs-item"><a href="/ru/hub/infosecurity/" class="tm-article-snippet__hubs-item-link tm-article-snippet__hubs-item-link_subscribed"><span>Информационная безопасность</span></a></span><span class="tm-article-snippet__hubs-item"><a href="/ru/hub/google_chrome/" class="tm-article-snippet__hubs-item-link tm-article-snippet__hubs-item-link_subscribed"><span>Google Chrome</span></a></span><span class="tm-article-snippet__hubs-item"><a href="/ru/hub/dns/" class="tm-article-snippet__hubs-item-link tm-article-snippet__hubs-item-link_subscribed"><span>DNS</span></a></span><span class="tm-article-snippet__hubs-item"><a href="/ru/hub/browser_extensions/" class="tm-article-snippet__hubs-item-link tm-article-snippet__hubs-item-link_subscribed"><span>Расширения для браузеров</span></a></span><span class="tm-article-snippet__hubs-item"><a href="/ru/hub/browsers/" class="tm-article-snippet__hubs-item-link tm-article-snippet__hubs-item-link_subscribed"><span>Браузеры</span></a></span></div><div class="tm-article-snippet__labels"><!----></div><!----><!----></div></div><!----><div lang="ru" class="tm-article-body"><div id="post-content-body" class="article-formatted-body article-formatted-body_version-2"><div xmlns="http://www.w3.org/1999/xhtml"><p>Google <a href="https://blog.chromium.org/2021/07/increasing-https-adoption.html" rel="noopener noreferrer nofollow">собирается повысить</a> безопасность пользователей Chrome с помощью новой функции, которая позволит автоматически обновлять веб-страницы до HTTPS. Режим HTTPS-First напоминает режим DNS-over-HTTPS в Firefox.</p><figure class="full-width "><img src="/img/image-loader.svg" alt="blog.chromium.org" title="blog.chromium.org" height="494" data-src="https://habrastorage.org/getpro/habr/upload_files/d12/208/e96/d12208e961ec1c4ddee464a2aca67cd5.gif" data-width="660"/><figcaption>blog.chromium.org</figcaption></figure><p>Как заявили в Google, с внедрением новой функции злоумышленники не смогут получить доступ к данным, передаваемым между веб-браузером и сервером, на котором размещен веб-сайт, поскольку конфиденциальная информация и учетные данные будут зашифрованы.</p><p>На данный момент примерно 90 % страниц в Chrome загружаются через HTTPS.</p><p>Однако в Chrome 94 браузер будет пытаться обновить все загружаемые страницы до HTTPS и начнет предупреждать пользователей при переходе на страницу, не поддерживающую данный тип шифрования.</p><p>«Основываясь на отзывах, мы рассмотрим возможность использования режима HTTPS-First по умолчанию для всех пользователей в будущем», — сообщают в Google. Там отмечают, что Mozilla планирует реализовать то же самое в Firefox.</p><p>Режим HTTPS-First внесет изменения в экран блокировки, который Chrome обычно отображает, когда сайт загружается по HTTPS. В качестве эксперимента Chrome 93 заменит значок замка на «более нейтральный», но индикатор «Небезопасно» будет по-прежнему отображаться на веб-сайтах, не поддерживающих HTTPS.</p><p>Даже в режиме HTTPS-First Chrome продолжит поддерживать HTTP-соединения, но наложит ограничения на загрузку определенных ресурсов, чтобы гарантировать защиту пользователей.</p><p>В мае в версии Chrome 83 <a href="https://habr.com/ru/news/t/502936/" rel="noopener noreferrer nofollow">начали развертывать</a> режим DNS-over-HTTPS. Браузер по умолчанию использует DoH для провайдера DNS, установленного в систему, при условии, что он поддерживает этот протокол. Если во время поиска будут обнаруживаться проблемы, то Chrome переключается на незашифрованный DNS. При этом браузер не использует DoH, если в системах Windows активен родительский контроль или определенные корпоративные политики. В апреле Chrome <a href="https://habr.com/ru/news/t/550210/" rel="noopener noreferrer nofollow">начал поддерживать</a> DoH в версии для Linux.</p><p>Microsoft также <a href="https://habr.com/ru/news/t/565390/" rel="noopener noreferrer nofollow">добавила</a> в ОС Windows 11 функцию DNS-over-HTTPS. </p></div></div><!----><!----></div><div class="tm-article-body__tags"><div class="tm-article-body__tags-links"><span class="tm-article-body__tags-title">Теги:</span><span class="tm-article-body__tags-item"><a href="/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5Bgoogle%20chrome%5D" class="tm-article-body__tags-item-link">google chrome</a></span><span class="tm-article-body__tags-item"><a href="/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5Bdns-over-https%5D" class="tm-article-body__tags-item-link">dns-over-https</a></span><span class="tm-article-body__tags-item"><a href="/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5Bdoh%5D" class="tm-article-body__tags-item-link">doh</a></span><span class="tm-article-body__tags-item"><a href="/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5Bhttps%5D" class="tm-article-body__tags-item-link">https</a></span><span class="tm-article-body__tags-item"><a href="/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5B%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%5D" class="tm-article-body__tags-item-link">шифрование данных</a></span><span class="tm-article-body__tags-item"><a href="/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5B%D1%82%D1%80%D0%B0%D1%84%D0%B8%D0%BA%5D" class="tm-article-body__tags-item-link">трафик</a></span><span class="tm-article-body__tags-item"><a href="/ru/search/?target_type=posts&amp;order=relevance&amp;q=%5Bhttp%5D" class="tm-article-body__tags-item-link">http</a></span></div><div class="tm-article-body__tags-links"><span class="tm-article-body__tags-title">Хабы:</span><span class="tm-article-body__tags-item"><a href="/ru/hub/infosecurity/" class="tm-article-body__tags-item-link">

            Информационная безопасность

          </a></span><span class="tm-article-body__tags-item"><a href="/ru/hub/google_chrome/" class="tm-article-body__tags-item-link">

            Google Chrome

          </a></span><span class="tm-article-body__tags-item"><a href="/ru/hub/dns/" class="tm-article-body__tags-item-link">

            DNS

          </a></span><span class="tm-article-body__tags-item"><a href="/ru/hub/browser_extensions/" class="tm-article-body__tags-item-link">

            Расширения для браузеров

          </a></span><span class="tm-article-body__tags-item"><a href="/ru/hub/browsers/" class="tm-article-body__tags-item-link">

            Браузеры

          </a></span></div></div></article><div class="tm-article__icons-wrapper"><div class="tm-data-icons tm-page-article__counters-panel"><div class="tm-article-rating tm-data-icons__item"><div class="tm-votes-meter tm-article-rating__votes-switcher"><svg height="16" width="16" class="tm-svg-img tm-votes-meter__icon tm-votes-meter__icon_medium"><title>Всего голосов 2: ^0 и v2</title><use xlink:href="/img/megazord-v24.4c3730a5.svg#counter-rating"></use></svg><span title="Всего голосов 2: ^0 и v2" class="tm-votes-meter__value tm-votes-meter__value_negative tm-votes-meter__value_medium">-2</span></div><DIV class="v-portal" style="display:none;"></DIV></div><!----><span title="Количество просмотров" class="tm-icon-counter tm-data-icons__item"><svg height="16" width="16" class="tm-svg-img tm-icon-counter__icon"><title>Просмотры</title><use xlink:href="/img/megazord-v24.4c3730a5.svg#counter-views"></use></svg><span class="tm-icon-counter__value">1.1K</span></span><button type="button" class="bookmarks-button tm-data-icons__item"><span title="Добавить в закладки" class="tm-svg-icon__wrapper bookmarks-button__icon"><svg height="16" width="16" class="tm-svg-img tm-svg-icon"><title>Добавить в закладки</title><use xlink:href="/img/megazord-v24.4c3730a5.svg#counter-favorite"></use></svg></span><span title="Количество пользователей, добавивших публикацию в закладки" class="bookmarks-button__counter">

0

</span></button><!----><div title="Поделиться" class="tm-sharing tm-data-icons__item"><button type="button" class="tm-sharing__button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class="tm-sharing__icon"><path fill="currentColor" d="M10.33.275l9.047 7.572a.2.2 0 010 .306l-9.048 7.572a.2.2 0 01-.328-.153V11c-8 0-9.94 6-9.94 6S-1 5 10 5V.428a.2.2 0 01.328-.153z"></path></svg></button><!----></div><DIV class="v-portal" style="display:none;"></DIV></div><!----></div></div><!----><div class="tm-page-article__additional-blocks"><!----><section class="tm-block tm-block_spacing-bottom"><!----><div class="tm-block__body"><div class="tm-article-author tm-page-article__author"><!----><div data-async-called="true" class="tm-user-card tm-article-author__user-card tm-user-card_variant-two-column"><div class="tm-user-card__info-container"><div class="tm-user-card__header"><div class="tm-user-card__header-data"><a href="/ru/users/maybe_elf/" class="tm-user-card__userpic tm-user-card__userpic_size-40"><div class="tm-entity-image"><img alt="" src="//habrastorage.org/getpro/habr/avatars/592/11d/4bc/59211d4bcd7f9afdadaef515b2b0706d.jpg" class="tm-entity-image__pic"></div></a><div class="tm-user-card__meta"><div title=" 399 голосов " class="tm-karma tm-user-card__karma"><div class="tm-karma__votes tm-karma__votes_positive">

105

</div><div class="tm-karma__text">


EOF;


$replace=$replace_str='<script>window.__INITIAL_STATE__={"adblock":{"hasAcceptableAdsFilter":false,"hasAdblock":false},"articlesList":{"articlesList":{"566102":{"id":"566102","timePublished":"2021-07-17T14:00:02+00:00","isCorporative":true,"lang":"ru","titleHtml":"Альтернативы Redux в 2021 году","editorVersion":"1.0","postType":"article","postLabels":[{"type":"translation","data":{"originalAuthorName":"Kristofer Selbekk","originalUrl":"https:\u002F\u002Fblog.openreplay.com\u002Fredux-alternatives-in-2021"}}],"author":{"id":"1220775","alias":"ru_vds","fullname":null,"avatarUrl":"\u002F\u002Fhabrastorage.org\u002Fgetpro\u002Fhabr\u002Favatars\u002Fe36\u002F812\u002Fd3d\u002Fe36812d3de38eb3d479d7a13228717ef.png","speciality":"Пользователь"},"statistics":{"commentsCount":0,"favoritesCount":1,"readingCount":102,"score":3,"votesCount":3},"hubs":[{"relatedData":{"isSubscribed":false},"id":"19791","alias":"ruvds","type":"corporative","title":"Блог компании RUVDS.com","titleHtml":"Блог компании RUVDS.com"},{"relatedData":{"isSubscribed":true},"id":"91","alias":"webdev","type":"collective","title":"Разработка веб-сайтов","titleHtml":"Разработка веб-сайтов"},{"relatedData":{"isSubscribed":true},"id":"357","alias":"javascript","type":"collective","title":"JavaScript","titleHtml":"JavaScript"},{"relatedData":{"isSubscribed":true},"id":"19327","alias":"reactjs","type":"collective","title":"ReactJS","titleHtml":"ReactJS"}]';


// экранируем замену, взято из FDE Grabber

$replace = preg_replace('#\$#', '\\\$', $replace);

$replace = preg_replace('#\\\(?=\d)#', '\\\\\\', $replace);

// /экранируем замену, взято из FDE Grabber


echo 'str_replace:';

$start = get_time();

for ($i=0; $i<25000; $i++){

  $thisoutput=str_replace('<div class="tm-karma__text">',$replace_str,$thisoutput.$i);

}

echo "\t".(get_time()-$start)."\r\n";


echo 'preg_replace:';

$start = get_time();

for ($i=0; $i<25000; $i++){

  

  $thisoutput1=preg_replace('@<div class="tm-karma__text">@',$replace,$thisoutput1.$i);

}

echo "\t".(get_time()-$start)."\r\n";


echo 'preg_replace i:';

$start = get_time();

for ($i=0; $i<25000; $i++){

  

  $thisoutput2=preg_replace('@<div class="tm-karma__text">@i',$replace,$thisoutput2.$i);

}

echo "\t".(get_time()-$start)."\r\n";



PHP 8.1 на реальной машине:


str_replace: 0.16252994537354

preg_replace: 0.06428599357605

preg_replace i: 0.065318822860718

вы написали ещё больший бред, потому, что у вас размножается значение $thisoutput2 / $thisoutput1 И с определённого момента вступает в силу pcre.backtrack_limit и preg функции уже начинают выдавать бредовый результат, тогда уж скорректируйте  и поставьте, например в начале скрипта

@ini_set('pcre.jit',0);
@ini_set('pcre.backtrack_limit', 90000000);// BY DEFAULT IS 100000
@ini_set('pcre.recursion_limit', 90000000);// BY DEFAULT IS 100000

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#32
Владимир #:


@ini_set('pcre.backtrack_limit', 5000000);

<?php

@ini_set('pcre.backtrack_limit', 5000000);

echo ini_get ('pcre.backtrack_limit');

echo "\r\n";

5000000
str_replace: 0.15876603126526
preg_replace: 0.064617156982422
preg_replace i: 0.066633939743042


Могу и больше:

5000000000
str_replace: 0.15234684944153
preg_replace: 0.060786962509155
preg_replace i: 0.066731929779053
✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
WS
На сайте с 01.11.2008
Offline
135
#33
LEOnidUKG #:

<?php

@ini_set('pcre.backtrack_limit', 5000000);

echo ini_get ('pcre.backtrack_limit');

echo "\r\n";


5000000

str_replace: 0.15876603126526

preg_replace: 0.064617156982422

preg_replace i: 0.066633939743042


Могу и больше:


5000000000

str_replace: 0.15234684944153

preg_replace: 0.060786962509155

preg_replace i: 0.066731929779053

а теперь поставьте

@ini_set('pcre.jit',0);
@ini_set('pcre.backtrack_limit', 90000000);// BY DEFAULT IS 100000
@ini_set('pcre.recursion_limit', 90000000);// BY DEFAULT IS 100000

5000000 оказалось мало

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#34

Давайте тест до 1000 уменьшим:

5000000000
str_replace: 0.0019919872283936
preg_replace: 0.001162052154541
preg_replace i: 0.0012760162353516

А можно и до 100

5000000000
str_replace: 0.00018906593322754
preg_replace: 0.00011491775512695
preg_replace i: 0.00012588500976562
WS
На сайте с 01.11.2008
Offline
135
#35
Владимир #:

а теперь поставьте

@ini_set('pcre.jit',0);
@ini_set('pcre.backtrack_limit', 90000000);// BY DEFAULT IS 100000
@ini_set('pcre.recursion_limit', 90000000);// BY DEFAULT IS 100000

5000000 оказалось мало

при таких условиях для вашего последнего скрипта у меня выдало

str_replace:    0.34097504615784
preg_replace:   1.2035641670227
preg_replace i: 1.2334840297699

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#36
Владимир #:
@ini_set('pcre.jit',0);
@ini_set('pcre.backtrack_limit', 90000000);// BY DEFAULT IS 100000
@ini_set('pcre.recursion_limit', 90000000);// BY DEFAULT IS 100000

<?php

@ini_set('pcre.jit',0);

@ini_set('pcre.backtrack_limit', 90000000);// BY DEFAULT IS 100000

@ini_set('pcre.recursion_limit', 90000000);// BY DEFAULT IS 100000

echo ini_get ('pcre.jit');

echo "\r\n";

echo ini_get ('pcre.backtrack_limit');

echo "\r\n";

echo ini_get ('pcre.recursion_limit');

echo "\r\n";

0
90000000
90000000
str_replace: 0.16834807395935
preg_replace: 0.058679103851318
preg_replace i: 0.066208839416504

PHP Version 8.1.17


WS
На сайте с 01.11.2008
Offline
135
#37

не знаю при каких условиях у вас мог получиться такой результат

PHP 8.2 со старым процессором

str_replace:    0.33971881866455
preg_replace:   1.2024669647217
preg_replace i: 1.2356669902802

PHP 8.0 с процессором со спекулятивным исполнением

str_replace:    0.3405020236969
preg_replace:   0.48409795761108
preg_replace i: 0.4930419921875

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#38

VDS, PHP 7.4

Вообще бред, регулярки c i быстрее, при чём всегда.

0
90000000
90000000
str_replace: 0.37781500816345
preg_replace: 0.52735304832458
preg_replace i: 0.49129390716553


Другой VDS, PHP 7.4

Не сказал бы, что сильная быстрее  str_replace, раз 10 проверил

0
90000000
90000000
str_replace: 0.25185203552246
preg_replace: 0.35379409790039
preg_replace i: 0.35928606987


Другой VDS, PHP 8.1

На доли доли быстрее.

0
90000000
90000000
str_replace: 0.34500694274902
preg_replace: 0.44255208969116
preg_replace i: 0.4721040725708


Windows 10. Перезагрузил свой apache, скорости в разы упали сразу. Весьма странно наблюдать такую регрессию. Возможно что-то уже сама ОС кэширует у себя.

25 000 - циклов

0
90000000
90000000
str_replace: 0.15765905380249
preg_replace: 0.35786294937134
preg_replace i: 0.35242486000061


250 000 - циклов, уже не такие страшные показатели.

0
90000000
90000000
str_replace: 15.019841909409
preg_replace: 19.820614099503
preg_replace i: 19.533653974533


Самое смешное, что даже мой же тест из первого топика стал быстрее для str_replace 🤣

preg_replace: 0.2176


preg_replace i: 0.2169
str_replace: 0.0322

В песочнице вообще можно получить интересные результаты:

https://onlinephp.io/c/547d4

PHP 8.1

0

90000000

90000000

str_replace: 0.77543902397156

preg_replace: 1.2858679294586

preg_replace i: 0.83956909179688


PHP 8.1

0

90000000

90000000

str_replace: 0.63856887817383

preg_replace: 0.66068816184998

preg_replace i: 0.64235186576843

PHP 7.3

0

90000000

90000000

str_replace: 0.55451011657715

preg_replace: 0.57687377929688

preg_replace i: 0.58461213111877

А вот уже 7.0

0

90000000

90000000

str_replace: 0.48414707183838

preg_replace: 2.1467258930206

preg_replace i:

Fatal error: Maximum execution time of 3 seconds exceeded in /home/user/scripts/code.php on line 65

Вот и нашли мы точку отправную, когда всё было плохо. Тогда больше склоняюсь к ответу от vitor, что:

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

Тем самым суть в том, что начиная с 7.2 можно использовать регулярки без сильной просадки в производительности. И чем новее версия PHP, тем меньше будет уже разница.

1 234

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