PHP тормозит str_replace

1 234
Dreammaker
На сайте с 20.04.2006
Offline
570
#21
LEOnidUKG :

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

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

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

Например, есть 1000 разных ключей или больше и нужно постоянно по ним искать, а вот тексты приходящие разные, то чтобы не мучить сервер циклами, гляньте в сторону php-реализаций алгоритма Ахо-Корасик, будете приятно удивлены суммарной скоростью поиска. Подходит, например, для проверки текстов на стоп-слова.

Из минусов:

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

2) чем больше список, тем больше нужно память, но не так чтобы глобально.

3) дерево нужно где-то хранить и время на его загрузку нужно (например, десериализация из кеша) 

3) это не минус, но как упоминание: на питоне есть какая-то усовершенствованная реализация, портированная из явы, ищет вроде как ещё быстрее.

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

Спасибо, но задача просто обработка HTML, модуль должен работать на любых сервера, на версиях PHP от 5.6

Поэтому, тут другое. Цикл я придумал чисто для тестирования скорости.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
L
На сайте с 10.02.2015
Offline
221
#23

Использовал у себя регулярки для замены текста.

Но оно криво работает, когда нужно заменять на $.

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#24
livetv #:

Использовал у себя регулярки для замены текста.

Но оно криво работает, когда нужно заменять на $.

$ является спец символом для вставки найденных данных из скобочек $1 $2 $3 и т.д.. Поэтому его надо писать \$ при замене.

L
На сайте с 10.02.2015
Offline
221
#25
LEOnidUKG #:

$ является спец символом для вставки найденных данных из скобочек $1 $2 $3 и т.д.. Поэтому его надо писать \$ при замене.

Там к примеру заменялось на код с базы.

Это нужно было заменять то, что заменять.

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

стало интересно и решил перепроверить, оказалось, что ваш тест поставлен некорректно и даёт искажённые результаты

я модифицировал ваш скрипт и получил результат, где, как и ожидается выигрывает str_replace, в каждой итерации текст надо изменять, чтобы было честно, для этого, я просто конкатенирую на каждой итерации значение счётчика к тексту:

<?php

function get_time()
{
        $t=microtime();
        $t=explode(' ',$t);
        $t=(float)$t[1]+(float)$t[0];
        return $t;
}

$thisoutput=<<<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++){
        $thisoutput2=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++){
        
        $thisoutput2=preg_replace('@<div class="tm-karma__text">@',$replace,$thisoutput.$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,$thisoutput.$i);
}
echo "\t".(get_time()-$start)."\r\n";

echo 'str_replace:';
$start = get_time();
for ($i=0; $i<25000; $i++){
        $thisoutput2=str_replace('<div class="tm-karma__text">',$replace_str,$thisoutput.$i);
        
}
echo "\t".(get_time()-$start)."\r\n";

результат вот такой:

str_replace:    0.13397407531738
preg_replace:   0.22444486618042
preg_replace i: 0.24331188201904
str_replace:    0.13409495353699
LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#27
что ваш тест поставлен некорректно и даёт искажённые результаты

Вы считаете, я делал этот тест ради теста? 😀

Я писал код, достаточно большого модуля, где обрабатывается весь HTML страницы любой длинны и там нужно делать замены (много замен). И вот оказалось, что при РЕАЛЬНОЙ работе, регулярки выигрывают.

Но так то, да, можно менять тест как угодно, в угоду того, что хочется получить.

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

как и ожидается выигрывает str_replace

Версию PHP только не сказали, но пусть у вас выигрывает, мне эта информация уже ни к чему.

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

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

я тестировал на 8.2 и на 5.3.9, везде str_replace быстрее, и это очевидно, что так и должно быть всегда, а вы в своём "тесте" долбите 25 тысяч раз не изменяющуюся переменную, очевидно, что пхп где-то проверяет не изменилось ли её значение, если не изменилось, то и выдаёт закэшированный результат, возможно и не пхп, а процессор со спекулятивным исполнением это кэширует, в реальной работе, как вы выразились, str_replace тоже будет быстрее, потому что в реальной программе не долбят функцию 25 тысяч раз, передавая в неё не изменяющуюся переменную/значение

на вашем месте я бы просто признал свою ошибку и не вставал в позу, это плохое качество - не уметь признавать ошибки

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

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

<?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
LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#30
Владимир #:
а вы в своём "тесте" долбите 25 тысяч-1 раз не изменяющуюся переменную

Так это в вашем случаи вы долбите не изменяющуюся переменную:

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

$thisoutput2 нигде же не используется. Я же переписываю каждый раз текущую переменную, эмулируя реальную работу кода.

на вашем месте я бы просто признал свою ошибку и не вставал в позу, это плохое качество - не уметь признавать ошибки

ого, советник по жизни пришёл. То то думаю я в жизненном  тупике, не знаю, что мне делать 🤣

1 234

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