как регекспом убить производительность
От: Кодт Россия  
Дата: 27.07.16 09:14
Оценка: 52 (7) :)
Это, конечно, тема обще-алгоритмическая, но в первую очередь, важна именно для скриптовых языков.

Недавно стековерфлоу лёг на простенькой функции, которая чистила строчку от концевых пробелов.
Мы же понимаем, как легко это делается регекспами: s/\s+$//
Беда подкралась внезапно: строка с 20тыс пробелов в середине.
Движок регекспа запнулся и устроил квадратичный забег с откатами.

http://stackstatus.net/post/147710624694/outage-postmortem-july-20-2016

"_____x__"
 +++++X    - неудача, откат
  ++++X    - неудача, откат
   +++X    - неудача, откат
    ++X    - неудача, откат
     +X    - неудача, откат
      X    - сразу неудача, идём дальше
       +++ - удача, конец
Перекуём баги на фичи!
Re: как регекспом убить производительность
От: Tonal- Россия www.promsoft.ru
Дата: 27.07.16 15:49
Оценка: 126 (4) +2
К>Недавно стековерфлоу лёг на простенькой функции, которая чистила строчку от концевых пробелов.
К>Мы же понимаем, как легко это делается регекспами: s/\s+$//
К>Беда подкралась внезапно: строка с 20тыс пробелов в середине.
А вот не нужно использовать регулярки там, где есть специализированные функции.
В любом современном языке есть функция для отрезания концевых пробелов, которая гарантированно работает быстрее, экономнее и главное корректно в любых ситуациях.

К>Движок регекспа запнулся и устроил квадратичный забег с откатами.

К>http://stackstatus.net/post/147710624694/outage-postmortem-july-20-2016
К>
К>"_____x__"
К> +++++X    - неудача, откат
К>  ++++X    - неудача, откат
К>   +++X    - неудача, откат
К>    ++X    - неудача, откат
К>     +X    - неудача, откат
К>      X    - сразу неудача, идём дальше
К>       +++ - удача, конец
К>

Простейший диалект языка регулярных выражений (РЕГ) эквивалентен детерминированному конечному автомату (ДКА).
И преобразовав РЕГ в ДКА можно проверить совпадение за линейное время.
Но, уже возможность группировки и получения значений сопоставленных групп ломает эту идилию.
Не говоря уже о ссылках на группы.

Поэтому большинство популярных реализаций использует реализацию через интерпретацию — типа расширенный НКА (недетерминированный конечный автомат).
Которая сильно более гибка (например реализации от MS, Lua, PCRE умеют описывать вложенные структуры), но улетает в экспоненту на некоторых типах регулярок и строк.
Что мы и видим на данном примере.

Есть интересный результат от 2000г — тегированный ДКА.
Описан здесь: http://laurikari.net/ville/spire2000-tnfa.pdf
Известные мне реализации на Haskell https://wiki.haskell.org/Regular_expressions#regex-tdfa и С http://laurikari.net/tre/about/
Как можно увидеть они пока что не дотягивают по плюшкам до стандартных реализаций.

Да, о реализации движков очень хорошо изложено в классической книжке «Регулярные выражения» Дж. Фридла, глава 4.
Там же описаны гибридные реализации. Например можно строить для регулярки ДКА (игнорируя некоторые навороты) и НКА. Далее ищем по строке с помощью ДКА, а имея совпадение прогоняем на нём НКА.
К сожалению, о ТДКА Фридл ни во втором, ни в 3-ем русском издании не упоминает.
Re[2]: как регекспом убить производительность
От: anonymous Россия http://denis.ibaev.name/
Дата: 28.07.16 07:43
Оценка: 3 (1) :)
Здравствуйте, Vain, Вы писали:

К>>Это, конечно, тема обще-алгоритмическая, но в первую очередь, важна именно для скриптовых языков.

V>Какая же попаболь у перловцев.. (первый же пример пропагандирует использование г-нищи)

В Perl стандартный способ сделать trim, это код:
$str =~ s/^\s+//;
$str =~ s/\s+$//;

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

V>PS Кстати, в перле есть такие встроенные переменные как $&. Помниться долго искал причину почему производительность регулярки была в районе плинтуса, хотя групинга никакого не было..


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

Сочувствую боли, которую ты причинил себе.
Re: как регекспом убить производительность
От: vsb Казахстан  
Дата: 27.07.16 11:10
Оценка: +2
А всё потому, что регэкспы надо разделить на две части — простые и сложные и явно отразить это в API. Простые регэкспы должны работать за O(N) (через DFA, например), а сложные пусть хоть заоткатываются.

А сейчас регэкспы это просто мессиво. Во-первых куча похожих, но отличающихся синтаксисов, во-вторых реализации без каких-то гарантий.
Re[2]: как регекспом убить производительность
От: ettcat США  
Дата: 20.08.16 19:10
Оценка: 3 (1)
T>Да, о реализации движков очень хорошо изложено в классической книжке «Регулярные выражения» Дж. Фридла, глава 4.
T>Там же описаны гибридные реализации. Например можно строить для регулярки ДКА (игнорируя некоторые навороты) и НКА. Далее ищем по строке с помощью ДКА, а имея совпадение прогоняем на нём НКА.
T>К сожалению, о ТДКА Фридл ни во втором, ни в 3-ем русском издании не упоминает.

Ещё неплохо почитать до сих пор актуальные статьи от Russ Cox: https://swtch.com/~rsc/regexp/
Он же написал RE2, которая в данном случае должна отрабатывать линейно, если мне склероз не изменяет. RE2 тоже не панацея, в некоторых случаях откатывается на реализацию с бэктрекингом.
Re[5]: как регекспом убить производительность
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 31.07.16 05:43
Оценка: 1 (1)
Здравствуйте, anonymous, Вы писали:

A>Не знаю. Могу только предположить, что оптимизация именно этих выражений, как часто используемых. Точнее второго: движок сразу понимает, что смотреть нужно конце, а не проверять, тянется ли найденное совпадение до конца.


A>Вот это уже не будет так работать:

A>
A>$str =~ s/(a|\s)+$//;
A>


5.20.3 — не тормозит.
The God is real, unless declared integer.
Re[2]: как регекспом убить производительность
От: мыщъх США http://nezumi-lab.org
Дата: 29.07.16 05:28
Оценка: +1
Здравствуйте, Слава, Вы писали:

С>Здравствуйте, Кодт, Вы писали:


К>>Мы же понимаем, как легко это делается регекспами: s/\s+$//

С>Зачем там потребовались регэкспы? Кто-то очень хорошо их знал, ценил, любил и применял?
начнем с того, что \s это не только пробел, но и табуляция. жду рабочего примера на асме или си. да, кодировки могут быть разные. при этом желательно чтобы по времени разработки и по наглядности кода вы не сильно отличались от регулярки. ну а производительность регулярок -- гуглим статьи Russ Cox'a. так что проблема не в регулярках, а в реализациях. почему в популярных языках используются такие реализации -- это другой вопрос.
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[6]: как регекспом убить производительность
От: anonymous Россия http://denis.ibaev.name/
Дата: 29.07.16 08:46
Оценка: +1
Здравствуйте, Vain, Вы писали:

A>>>>Сочувствую боли, которую ты причинил себе.

V>>>У меня не было боли.
A>>Откуда ж ты о ней знаешь?
V>Потому что как и все наступил на эти раскиданные грабли, но быстро увернулся

Прочувствовал, значит.

A>>Ага, нахватаются где-то вершков про встроенные переменные, а потом язык у них виноват.

V>Да, виноват, потому что является поставщиком скрытых "Performance issue" и других "прелестей"

Как они могут быть скрытыми, если они явно описаны в документации? Ты пытаешься использовать возможность языка, не прочитав документацию, а потом винишь язык в том, что эта возможность работает не так, как ты себе напридумывал.

A>>Другие потом читают написанный первыми код и думают: «Капец язык, ничего не понять!»

V>Так это недолго, скоро нечего будет читать

Отладил один скрипт и туда же — эксперт по умирающим языкам.
Re: как регекспом убить производительность
От: cures Россия cures.narod.ru
Дата: 02.08.16 23:49
Оценка: +1
Здравствуйте, Кодт, Вы писали:

К>Движок регекспа запнулся и устроил квадратичный забег с откатами.


Строго говоря, не регекспом, а плохим движком, в чём они честно и признаются: "simple backtracking Regex engine". Это всё ещё поди в похапе каком-нибудь было. Сам по себе регексп вполне нормальный, автоматный. А вот креативные движки, чтобы любая кухарка за пять минут сделала себе магазин и бложег — зло. Особенно когда на них делают нагруженные сайты. Особенно "дванольные", "динамические" бесят: зайдёшь на курсеру или хакерранк, откроешь несколько страниц — и сразу и лиса и хром хоть на атоме хоть на i5 пухнут и дохнут, затыкая весь брафсер (лиса) пока не прочухаются. Чем статика не устраивает? Обязательно что-нибудь должно попукивать и похрюкивать?
Мне как-то знакомая кидала ссылку на сайтик, который слабала на каком-то доморощенном "портале" викс с конструктором: там на дефолтном заднем плане звёзды летят, он практически весь закрыт собственно страничкой, на несколько пикселей торчит, но это не мешает движку их таки отрисовывать (хотя потом и не показывать), видимо, попиксельно, а то ещё и с рей-трейсингом, скорее всего на жабаскрипте. "Хлебнули мы ещё фанты — и тормознули автобус с омоном крутейший i5 с 16 гигами оперативы".
Re: как регекспом убить производительность
От: VTT http://vtt.to
Дата: 27.07.16 10:17
Оценка:
Вообще-то там проблема не столько с регуляркой, сколько с ее применением для одного и того же (не изменяющегося) поста каждый раз при запросе их домашней страницы.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re: как регекспом убить производительность
От: flаt  
Дата: 27.07.16 10:57
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Это, конечно, тема обще-алгоритмическая, но в первую очередь, важна именно для скриптовых языков.


Вот ещё весёлые примеры: https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS
Re[2]: как регекспом убить производительность
От: Кодт Россия  
Дата: 27.07.16 11:11
Оценка:
Здравствуйте, VTT, Вы писали:

VTT>Вообще-то там проблема не столько с регуляркой, сколько с ее применением для одного и того же (не изменяющегося) поста каждый раз при запросе их домашней страницы.


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

А то вдруг найдутся добрые люди и сделают дос-бомбу для какого-нибудь блога или форума.
Перекуём баги на фичи!
Re[2]: как регекспом убить производительность
От: Кодт Россия  
Дата: 27.07.16 11:20
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>А всё потому, что регэкспы надо разделить на две части — простые и сложные и явно отразить это в API. Простые регэкспы должны работать за O(N) (через DFA, например), а сложные пусть хоть заоткатываются.

vsb>А сейчас регэкспы это просто мессиво. Во-первых куча похожих, но отличающихся синтаксисов, во-вторых реализации без каких-то гарантий.

Как отличать простые регекспы от сложных? Ещё один синтаксис?
Перекуём баги на фичи!
Re[3]: как регекспом убить производительность
От: vsb Казахстан  
Дата: 27.07.16 12:32
Оценка:
Здравствуйте, Кодт, Вы писали:

vsb>>А всё потому, что регэкспы надо разделить на две части — простые и сложные и явно отразить это в API. Простые регэкспы должны работать за O(N) (через DFA, например), а сложные пусть хоть заоткатываются.

vsb>>А сейчас регэкспы это просто мессиво. Во-первых куча похожих, но отличающихся синтаксисов, во-вторых реализации без каких-то гарантий.

К>Как отличать простые регекспы от сложных? Ещё один синтаксис?


Простые это подмножество сложных, без тех фич, которые невозможно реализовать в рамках конечных автоматов. Ну и ещё раз повторю — отдельное API для них, чтобы сразу было видно, какую производительность можно ожидать.
Re[4]: как регекспом убить производительность
От: Кодт Россия  
Дата: 27.07.16 13:10
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Простые это подмножество сложных, без тех фич, которые невозможно реализовать в рамках конечных автоматов. Ну и ещё раз повторю — отдельное API для них, чтобы сразу было видно, какую производительность можно ожидать.


Исходный регексп ^(.*?)(\s+)$ вполне себе реализуется на недетерминированном конечном автомате. И в детерминированный его переделать несложно.
Проблема в том, что похожий на него ^(.*?)(\s\s)+$ — находящий чётное количество концевых пробелов (если концевое количество нечётное — первый пробел проигнорирует) — рождает уже довольно громоздкий детерминированный автомат.
И ведь нам интересно не только получить ответ "подходит — не подходит", но и координаты групп найти.
Перекуём баги на фичи!
Re[3]: как регекспом убить производительность
От: flаt  
Дата: 27.07.16 16:53
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Как отличать простые регекспы от сложных? Ещё один синтаксис?


Например: https://github.com/google/re2
Re: как регекспом убить производительность
От: Vain Россия google.ru
Дата: 27.07.16 21:14
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Это, конечно, тема обще-алгоритмическая, но в первую очередь, важна именно для скриптовых языков.

Какая же попаболь у перловцев.. (первый же пример пропагандирует использование г-нищи)

PS Кстати, в перле есть такие встроенные переменные как $&. Помниться долго искал причину почему производительность регулярки была в районе плинтуса, хотя групинга никакого не было..
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Отредактировано 28.07.2016 0:23 Vain . Предыдущая версия . Еще …
Отредактировано 27.07.2016 21:22 Vain . Предыдущая версия .
Re[3]: как регекспом убить производительность
От: Sharov Россия  
Дата: 28.07.16 08:59
Оценка:
Здравствуйте, anonymous, Вы писали:

A>Здравствуйте, Vain, Вы писали:


К>>>Это, конечно, тема обще-алгоритмическая, но в первую очередь, важна именно для скриптовых языков.

V>>Какая же попаболь у перловцев.. (первый же пример пропагандирует использование г-нищи)

A>В Perl стандартный способ сделать trim, это код:

A>
A>$str =~ s/^\s+//;
A>$str =~ s/\s+$//;
A>

A>И он не спотыкается на указанной в начальном сообщении строке.

Почему? Движок, стандарт другой?
Кодом людям нужно помогать!
Re[3]: как регекспом убить производительность
От: VTT http://vtt.to
Дата: 28.07.16 09:52
Оценка:
Здравствуйте, anonymous, Вы писали:

A>В Perl стандартный способ сделать trim, это код:

$str =~ s/^\s+//;
$str =~ s/\s+$//;


Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re[4]: как регекспом убить производительность
От: anonymous Россия http://denis.ibaev.name/
Дата: 28.07.16 10:25
Оценка:
Здравствуйте, Sharov, Вы писали:

A>>В Perl стандартный способ сделать trim, это код:

A>>
A>>$str =~ s/^\s+//;
A>>$str =~ s/\s+$//;
A>>

A>>И он не спотыкается на указанной в начальном сообщении строке.
S>Почему? Движок, стандарт другой?

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

Вот это уже не будет так работать:
$str =~ s/(a|\s)+$//;

А это будет:
$str =~ s/[a\s]+$//;
Re[4]: как регекспом убить производительность
От: anonymous Россия http://denis.ibaev.name/
Дата: 28.07.16 10:32
Оценка:
Здравствуйте, VTT, Вы писали:

A>>В Perl стандартный способ сделать trim, это код:

VTT>
VTT>$str =~ s/^\s+//;
VTT>$str =~ s/\s+$//;
VTT>

VTT>Image: how_programmers_see_perl_programmers.jpg


s,^\s+,,,s,\s+$,, for$str;
Re[3]: как регекспом убить производительность
От: Vain Россия google.ru
Дата: 28.07.16 21:21
Оценка:
Здравствуйте, anonymous, Вы писали:

A>О том, что использование встроенных переменных понижает производительность регулярных выражений, прямо написано в документации.

Чтобы что-то прочитать из документации надо сначало хотя бы знать что искать и где. А когда хер знает из-за чего тормозит это уже претензии к перлу будут в целом.

A>Сочувствую боли, которую ты причинил себе.

У меня не было боли. Отладил и забыл. А вот что-то серьёзное на перле писать я уже не буду. Благо есть языки получше.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[4]: как регекспом убить производительность
От: anonymous Россия http://denis.ibaev.name/
Дата: 28.07.16 21:57
Оценка:
Здравствуйте, Vain, Вы писали:

A>>О том, что использование встроенных переменных понижает производительность регулярных выражений, прямо написано в документации.

V>Чтобы что-то прочитать из документации надо сначало хотя бы знать что искать и где. А когда хер знает из-за чего тормозит это уже претензии к перлу будут в целом.

perldoc perlvar → Variables related to regular expressions → Performance issues

A>>Сочувствую боли, которую ты причинил себе.

V>У меня не было боли.

Откуда ж ты о ней знаешь?

V>Отладил и забыл. А вот что-то серьёзное на перле писать я уже не буду. Благо есть языки получше.


Ага, нахватаются где-то вершков про встроенные переменные, а потом язык у них виноват. Другие потом читают написанный первыми код и думают: «Капец язык, ничего не понять!»
Re: как регекспом убить производительность
От: Слава  
Дата: 28.07.16 22:10
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Это, конечно, тема обще-алгоритмическая, но в первую очередь, важна именно для скриптовых языков.


К>Недавно стековерфлоу лёг на простенькой функции, которая чистила строчку от концевых пробелов.

К>Мы же понимаем, как легко это делается регекспами: s/\s+$//

Если я правильно помню, подобный поиск первого не-пробельного символа делался на ассемблере с помощью одной инструкции вроде repnz scas <образец>, <указатель на строку>, или что-то вроде. Для C-подобных языков это делалось бы обычным for i--, а в C# вообще есть стандартный TrimEnd у строки. Зачем там потребовались регэкспы? Кто-то очень хорошо их знал, ценил, любил и применял?
Re[5]: как регекспом убить производительность
От: Vain Россия google.ru
Дата: 29.07.16 08:33
Оценка:
Здравствуйте, anonymous, Вы писали:

A>>>Сочувствую боли, которую ты причинил себе.

V>>У меня не было боли.
A>Откуда ж ты о ней знаешь?
Потому что как и все наступил на эти раскиданные грабли, но быстро увернулся

V>>Отладил и забыл. А вот что-то серьёзное на перле писать я уже не буду. Благо есть языки получше.

A>Ага, нахватаются где-то вершков про встроенные переменные, а потом язык у них виноват.
Да, виноват, потому что является поставщиком скрытых "Performance issue" и других "прелестей"

A>Другие потом читают написанный первыми код и думают: «Капец язык, ничего не понять!»

Так это недолго, скоро нечего будет читать
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[7]: как регекспом убить производительность
От: Vain Россия google.ru
Дата: 29.07.16 09:04
Оценка:
Здравствуйте, anonymous, Вы писали:

A>>>>>Сочувствую боли, которую ты причинил себе.

V>>>>У меня не было боли.
A>>>Откуда ж ты о ней знаешь?
V>>Потому что как и все наступил на эти раскиданные грабли, но быстро увернулся
A>Прочувствовал, значит.
Тебя видимо попаболь берёт, что сам мучился и продолжаешь мучаться, а другие нет

A>>>Ага, нахватаются где-то вершков про встроенные переменные, а потом язык у них виноват.

V>>Да, виноват, потому что является поставщиком скрытых "Performance issue" и других "прелестей"
A>Как они могут быть скрытыми, если они явно описаны в документации?
Ну я говорю, на заборе тоже много чего пишут...

A>Ты пытаешься использовать возможность языка, не прочитав документацию, а потом винишь язык в том, что эта возможность работает не так, как ты себе напридумывал.

Представь, даже не пытался использовать, просто решил проверить.

A>>>Другие потом читают написанный первыми код и думают: «Капец язык, ничего не понять!»

V>>Так это недолго, скоро нечего будет читать
A>Отладил один скрипт и туда же — эксперт по умирающим языкам.
Зачем мне становиться экспертом г-на?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Отредактировано 29.07.2016 9:07 Vain . Предыдущая версия .
Re[8]: как регекспом убить производительность
От: anonymous Россия http://denis.ibaev.name/
Дата: 29.07.16 09:29
Оценка:
Здравствуйте, Vain, Вы писали:

V>>>>>У меня не было боли.

A>>>>Откуда ж ты о ней знаешь?
V>>>Потому что как и все наступил на эти раскиданные грабли, но быстро увернулся
A>>Прочувствовал, значит.
V>Тебя видимо попаболь берёт, что сам мучился и продолжаешь мучаться, а другие нет

Какая разница, что там у меня? Ты ж либо на своём опыте ощущения описываешь, либо додумал, опять же основываясь на своём опыте.

A>>Как они могут быть скрытыми, если они явно описаны в документации?

V>Ну я говорю, на заборе тоже много чего пишут...

Официальная документация по-твоему — забор? Ясно-понятно.

A>>Ты пытаешься использовать возможность языка, не прочитав документацию, а потом винишь язык в том, что эта возможность работает не так, как ты себе напридумывал.

V>Представь, даже не пытался использовать, просто решил проверить.

Это и есть использование.

A>>Отладил один скрипт и туда же — эксперт по умирающим языкам.

V>Зачем мне становиться экспертом г-на?

Тебе виднее, зачем ты им стал?
Re[9]: как регекспом убить производительность
От: Vain Россия google.ru
Дата: 29.07.16 20:30
Оценка:
Здравствуйте, anonymous, Вы писали:

A>>>Прочувствовал, значит.

V>>Тебя видимо попаболь берёт, что сам мучился и продолжаешь мучаться, а другие нет
A>Какая разница, что там у меня? Ты ж либо на своём опыте ощущения описываешь, либо додумал, опять же основываясь на своём опыте.
а ты не на своём опыте мне свои ощущения начал приписывать?

A>>>Как они могут быть скрытыми, если они явно описаны в документации?

V>>Ну я говорю, на заборе тоже много чего пишут...
A>Официальная документация по-твоему — забор? Ясно-понятно.
Любая. Всё надо проверять.

A>>>Ты пытаешься использовать возможность языка, не прочитав документацию, а потом винишь язык в том, что эта возможность работает не так, как ты себе напридумывал.

V>>Представь, даже не пытался использовать, просто решил проверить.
A>Это и есть использование.
Нет, изначально оно не использовалось.

A>>>Отладил один скрипт и туда же — эксперт по умирающим языкам.

V>>Зачем мне становиться экспертом г-на?
A>Тебе виднее, зачем ты им стал?
Зачем ты бъёшь жену?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[10]: как регекспом убить производительность
От: мыщъх США http://nezumi-lab.org
Дата: 29.07.16 20:35
Оценка:
Здравствуйте, Vain, Вы писали:

V>Здравствуйте, anonymous, Вы писали:


A>>Официальная документация по-твоему — забор? Ясно-понятно.

V>Любая. Всё надо проверять.
а разве можно как-то иначе?
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re[11]: как регекспом убить производительность
От: Vain Россия google.ru
Дата: 29.07.16 20:36
Оценка:
Здравствуйте, мыщъх, Вы писали:

A>>>Официальная документация по-твоему — забор? Ясно-понятно.

V>>Любая. Всё надо проверять.
М>а разве можно как-то иначе?
Про то и речь, что документация здесь не особо играет рояль.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[10]: как регекспом убить производительность
От: anonymous Россия http://denis.ibaev.name/
Дата: 29.07.16 22:35
Оценка:
Здравствуйте, Vain, Вы писали:

A>>Какая разница, что там у меня? Ты ж либо на своём опыте ощущения описываешь, либо додумал, опять же основываясь на своём опыте.

V>а ты не на своём опыте мне свои ощущения начал приписывать?

Я только что описал, на основании чего сделал свои выводы.

A>>>>Как они могут быть скрытыми, если они явно описаны в документации?

A>>Официальная документация по-твоему — забор? Ясно-понятно.
V>Любая. Всё надо проверять.

При чём тут проверка? Я бы понял тебя, если бы обнаруженное тобой поведение не соответствовало описанию. Но в этом случае не так.

V>>>Представь, даже не пытался использовать, просто решил проверить.

A>>Это и есть использование.
V>Нет, изначально оно не использовалось.

Но потом-то использовалось. Пробовал — значит пользовался.

V>>>Зачем мне становиться экспертом г-на?

A>>Тебе виднее, зачем ты им стал?
V>Зачем ты бъёшь жену?

Это не я.
Re[12]: как регекспом убить производительность
От: anonymous Россия http://denis.ibaev.name/
Дата: 29.07.16 22:40
Оценка:
Здравствуйте, Vain, Вы писали:

V>Про то и речь, что документация здесь не особо играет рояль.


У тебя есть описание — ты можешь его проверить. У тебя нет описания — проверять тебе нечего, кроме своих догадок. Но инструмент не виноват, что у тебя с догадками проблемы.
Re[13]: как регекспом убить производительность
От: Vain Россия google.ru
Дата: 30.07.16 15:51
Оценка:
Здравствуйте, anonymous, Вы писали:

V>>Про то и речь, что документация здесь не особо играет рояль.

A>У тебя есть описание — ты можешь его проверить.
Я проверяю код а не описание, что за чушь?

A>У тебя нет описания — проверять тебе нечего, кроме своих догадок. Но инструмент не виноват, что у тебя с догадками проблемы.

Бред сивой кобылы
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[11]: как регекспом убить производительность
От: Vain Россия google.ru
Дата: 30.07.16 15:54
Оценка:
Здравствуйте, anonymous, Вы писали:

A>>>Какая разница, что там у меня? Ты ж либо на своём опыте ощущения описываешь, либо додумал, опять же основываясь на своём опыте.

V>>а ты не на своём опыте мне свои ощущения начал приписывать?
A>Я только что описал, на основании чего сделал свои выводы.

Прочувствовал, значит.

Тут нет оснований, одни догадки.

A>>>>>Как они могут быть скрытыми, если они явно описаны в документации?

A>>>Официальная документация по-твоему — забор? Ясно-понятно.
V>>Любая. Всё надо проверять.
A>При чём тут проверка? Я бы понял тебя, если бы обнаруженное тобой поведение не соответствовало описанию. Но в этом случае не так.
Самое лучшее описание это проверенное тобой лично, что я и сделал.

V>>>>Представь, даже не пытался использовать, просто решил проверить.

A>>>Это и есть использование.
V>>Нет, изначально оно не использовалось.
A>Но потом-то использовалось. Пробовал — значит пользовался.
Ты читать умеешь? Написал же что решил проверить.

V>>>>Зачем мне становиться экспертом г-на?

A>>>Тебе виднее, зачем ты им стал?
V>>Зачем ты бъёшь жену?
A>Это не я.
Т.е. кто-то бъёт твою жену, а ты просто смотришь?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[12]: как регекспом убить производительность
От: anonymous Россия http://denis.ibaev.name/
Дата: 30.07.16 19:04
Оценка:
Здравствуйте, Vain, Вы писали:

A>>>>Какая разница, что там у меня? Ты ж либо на своём опыте ощущения описываешь, либо додумал, опять же основываясь на своём опыте.

V>>>а ты не на своём опыте мне свои ощущения начал приписывать?
A>>Я только что описал, на основании чего сделал свои выводы.
V>Прочувствовал, значит. Тут нет оснований, одни догадки.

Ты вообще читаешь, прежде чем ответить? Я специально для тебя цитирование оставил.

A>>При чём тут проверка? Я бы понял тебя, если бы обнаруженное тобой поведение не соответствовало описанию. Но в этом случае не так.

V>Самое лучшее описание это проверенное тобой лично, что я и сделал.

Демагогия.

A>>Но потом-то использовалось. Пробовал — значит пользовался.

V>Ты читать умеешь? Написал же что решил проверить.

Ну. Пользовался.

V>>>>>Зачем мне становиться экспертом г-на?

A>>>>Тебе виднее, зачем ты им стал?
V>Т.е. кто-то бъёт твою жену, а ты просто смотришь?

Нет, кто-то пытается уйти от обсуждения своей экспертной области.
Отредактировано 30.07.2016 19:10 anonymous . Предыдущая версия .
Re[14]: как регекспом убить производительность
От: anonymous Россия http://denis.ibaev.name/
Дата: 30.07.16 19:07
Оценка:
Здравствуйте, Vain, Вы писали:

A>>У тебя есть описание — ты можешь его проверить.

A>>У тебя нет описания — проверять тебе нечего, кроме своих догадок. Но инструмент не виноват, что у тебя с догадками проблемы.
V>Бред сивой кобылы

Так себе аргумент.
Re[15]: как регекспом убить производительность
От: Vain Россия google.ru
Дата: 31.07.16 00:31
Оценка:
Здравствуйте, anonymous, Вы писали:

A>>>У тебя есть описание — ты можешь его проверить.

A>>>У тебя нет описания — проверять тебе нечего, кроме своих догадок. Но инструмент не виноват, что у тебя с догадками проблемы.
V>>Бред сивой кобылы
A>Так себе аргумент.
когда чушню пишут — нормальный
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[6]: как регекспом убить производительность
От: anonymous Россия http://denis.ibaev.name/
Дата: 31.07.16 06:47
Оценка:
Здравствуйте, netch80, Вы писали:

A>>Вот это уже не будет так работать:

A>>
A>>$str =~ s/(a|\s)+$//;
A>>

N>5.20.3 — не тормозит.

Значит оптимизировали. Я на 5.18 проверял.
Re[13]: как регекспом убить производительность
От: Vain Россия google.ru
Дата: 31.07.16 11:56
Оценка:
Здравствуйте, anonymous, Вы писали:

A>>>При чём тут проверка? Я бы понял тебя, если бы обнаруженное тобой поведение не соответствовало описанию. Но в этом случае не так.

V>>Самое лучшее описание это проверенное тобой лично, что я и сделал.
A>Демагогия.
лучше чем твой тупенький троллинг

V>>>>>>Зачем мне становиться экспертом г-на?

A>>>>>Тебе виднее, зачем ты им стал?
V>>Т.е. кто-то бъёт твою жену, а ты просто смотришь?
A>Нет, кто-то пытается уйти от обсуждения своей экспертной области.
нет, кто то пытается троллить и не выходит
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: как регекспом убить производительность
От: _NN_  
Дата: 01.08.16 20:29
Оценка:
Здравствуйте, Кодт, Вы писали:

В копилку могу добавить и антипаттерн вида:
^prefix.+


Казалось бы тут можно оптимизировать и остановиться сразу как нашли начало, однако '.' означает всё кроме (в зависимости от флагов) символа новой строки.
И получаем полное сканирование входной строки.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: как регекспом убить производительность
От: cures Россия cures.narod.ru
Дата: 03.08.16 00:07
Оценка:
Здравствуйте, мыщъх, Вы писали:

К>>>Мы же понимаем, как легко это делается регекспами: s/\s+$//

М>начнем с того, что \s это не только пробел, но и табуляция. жду рабочего примера на асме или си.

На С — легко, если только ASCII, то есть быстрый макрос isspace, помним позицию последнего непробельного, если уткнулись в педаль — перекидываем туда позицию для дальнейшего вывода.

М> да, кодировки могут быть разные.


Кодировки в этот момент обычно не должны сильно парить, строка уже должна без кодировок в четырёхбайтном представлении быть. Если Вы, конечно, не разработчик извращений типа Julia, где внутреннее представление UTF-8. При этом проверка на пробельность чуть сложнее, но всё равно за константу, причём уже наверняка реализована, потому алгоритм не меняется.

М> при этом желательно чтобы по времени разработки и по наглядности кода вы не сильно отличались от регулярки.


Наглядность — это фор хум хау. Вы репорт читали? Там таки кошмарненький исходный регексп, это они уже для ясности упростили. Ну и вызов функции trim гораздо более нагляден.

М> ну а производительность регулярок -- гуглим статьи Russ Cox'a. так что проблема не в регулярках, а в реализациях.


+1, и надо будет почитать на досуге.

М> почему в популярных языках используются такие реализации -- это другой вопрос.


Почему серьёзные сайты делают на "популярных языках" — это ещё более другой вопрос
Re[2]: как регекспом убить производительность
От: cures Россия cures.narod.ru
Дата: 03.08.16 00:15
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>В копилку могу добавить и антипаттерн вида:

^prefix.+


_NN>Казалось бы тут можно оптимизировать и остановиться сразу как нашли начало, однако '.' означает всё кроме (в зависимости от флагов) символа новой строки.

_NN>И получаем полное сканирование входной строки.

Сканирование (если префикс нашли) будет, может даже двойная память потребуется, но ведь квадрат не вылезет: дойдём до конца строки, и, если по дороге было что-то, то отработаем? Вот если без птички в начале, тогда печалька, будем на каждом вхождении префикса внутри строки перезапускаться и поимеем квадрат. Хотя, если хвост сам по себе не нужен (например, мы не хотим его тоже выкинуть), то действительно оверхед, но не критичный.
Re[3]: как регекспом убить производительность
От: _NN_  
Дата: 03.08.16 10:55
Оценка:
Здравствуйте, cures, Вы писали:

C>Сканирование (если префикс нашли) будет, может даже двойная память потребуется, но ведь квадрат не вылезет: дойдём до конца строки, и, если по дороге было что-то, то отработаем? Вот если без птички в начале, тогда печалька, будем на каждом вхождении префикса внутри строки перезапускаться и поимеем квадрат. Хотя, если хвост сам по себе не нужен (например, мы не хотим его тоже выкинуть), то действительно оверхед, но не критичный.


У нас получился критичный, было много регулярок такого плана, приходило много строк по 100кб и каждую сканировали по нескольку раз
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: как регекспом убить производительность
От: fin_81  
Дата: 04.08.16 11:43
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>У нас получился критичный, было много регулярок такого плана, приходило много строк по 100кб и каждую сканировали по нескольку раз


Почему не объединить регулярки дизъюнкцией "|" и скомпилировать? Разная логика на каждую регулярку? А если объединить, те которые с одинаковой логикой?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.