- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Как снизить ДРР до 4,38% и повысить продажи с помощью VK Рекламы
Для интернет-магазина инженерных систем
Мария Лосева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Писал я себе код и решил проверить скорость работы str_replace и preg_replace. Многие же писали, что регулярки тормознее.
Запилил тест и был в шоке, на последней версии PHP 8... str_replace ТОРМОЗИТ! При чём в два раза медленее.
На случай, если вдруг задачей является искать по ограниченному количеству ключей в разных и разного размера текстах ...
Например, есть 1000 разных ключей или больше и нужно постоянно по ним искать, а вот тексты приходящие разные, то чтобы не мучить сервер циклами, гляньте в сторону php-реализаций алгоритма Ахо-Корасик, будете приятно удивлены суммарной скоростью поиска. Подходит, например, для проверки текстов на стоп-слова.
Из минусов:
1) на генерацию дерева из ключей нужно время - несколько секунд как минимум. То есть, добавление ключей в список нужно делать не в рамках выполнения основного скрипта (можно, например, по крону или по событию в админке)
2) чем больше список, тем больше нужно память, но не так чтобы глобально.
3) дерево нужно где-то хранить и время на его загрузку нужно (например, десериализация из кеша)
3) это не минус, но как упоминание: на питоне есть какая-то усовершенствованная реализация, портированная из явы, ищет вроде как ещё быстрее.
Спасибо, но задача просто обработка HTML, модуль должен работать на любых сервера, на версиях PHP от 5.6
Поэтому, тут другое. Цикл я придумал чисто для тестирования скорости.
Использовал у себя регулярки для замены текста.
Но оно криво работает, когда нужно заменять на $.
Использовал у себя регулярки для замены текста.
Но оно криво работает, когда нужно заменять на $.
$ является спец символом для вставки найденных данных из скобочек $1 $2 $3 и т.д.. Поэтому его надо писать \$ при замене.
$ является спец символом для вставки найденных данных из скобочек $1 $2 $3 и т.д.. Поэтому его надо писать \$ при замене.
Там к примеру заменялось на код с базы.
Это нужно было заменять то, что заменять.
стало интересно и решил перепроверить, оказалось, что ваш тест поставлен некорректно и даёт искажённые результаты
я модифицировал ваш скрипт и получил результат, где, как и ожидается выигрывает str_replace, в каждой итерации текст надо изменять, чтобы было честно, для этого, я просто конкатенирую на каждой итерации значение счётчика к тексту:
результат вот такой:
Вы считаете, я делал этот тест ради теста? 😀
Я писал код, достаточно большого модуля, где обрабатывается весь HTML страницы любой длинны и там нужно делать замены (много замен). И вот оказалось, что при РЕАЛЬНОЙ работе, регулярки выигрывают.
Но так то, да, можно менять тест как угодно, в угоду того, что хочется получить.
В моём тесте, я просто взял кусок модуля рабочего, где надо менять исходный код постоянно, а не сохранять его в отдельную переменную.
как и ожидается выигрывает str_replace
Версию PHP только не сказали, но пусть у вас выигрывает, мне эта информация уже ни к чему.
Пусть каждый сам тестирует свой код на производительность. И лучше это делать на реальной машине.
я тестировал на 8.2 и на 5.3.9, везде str_replace быстрее, и это очевидно, что так и должно быть всегда, а вы в своём "тесте" долбите 25 тысяч раз не изменяющуюся переменную, очевидно, что пхп где-то проверяет не изменилось ли её значение, если не изменилось, то и выдаёт закэшированный результат, возможно и не пхп, а процессор со спекулятивным исполнением это кэширует, в реальной работе, как вы выразились, str_replace тоже будет быстрее, потому что в реальной программе не долбят функцию 25 тысяч раз, передавая в неё не изменяющуюся переменную/значение
на вашем месте я бы просто признал свою ошибку и не вставал в позу, это плохое качество - не уметь признавать ошибки
А давайте ваш тест поменяем, чтобы для каждой функции будет свой текст и мы уберём в конце дублирование функции в конце.
<?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&order=relevance&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&order=relevance&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&order=relevance&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&order=relevance&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&order=relevance&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&order=relevance&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&order=relevance&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 на реальной машине:
а вы в своём "тесте" долбите 25 тысяч-1 раз не изменяющуюся переменную
Так это в вашем случаи вы долбите не изменяющуюся переменную:
$thisoutput2=preg_replace('@<div class="tm-karma__text">@',$replace,$thisoutput.$i);
$thisoutput2 нигде же не используется. Я же переписываю каждый раз текущую переменную, эмулируя реальную работу кода.
на вашем месте я бы просто признал свою ошибку и не вставал в позу, это плохое качество - не уметь признавать ошибки
ого, советник по жизни пришёл. То то думаю я в жизненном тупике, не знаю, что мне делать 🤣