Pull to refresh

Comments 14

А где же ссылка на re2? Это ведь как раз про неё. Она особенно быстра, если знать, как её оттюнить внутри. Статья 2007 года, но думаю качественные характеристики не потеряли своей актуальности.
Различия реализаций регулярок на ДКА и НКА еще в той самой книжке Фридла были рассмотрены. Насколько я помню, со скоростью приходят некоторые ограничения.
http://www.depesz.com/2013/04/10/waiting-for-9-3-support-indexing-of-regular-expression-searches-in-contribpg_trgm/
Кстати да, а если учесть что pg (как и tcl) юзает традиционный NFA regex engine, то все просто замечательно с ним.
А чего там кстати люди ждут — обыкновенный calc index (aka «index on expression») по функции regexp_matches не поможет? (всю простыню по ссылке выше времени нет осилить)
По ссылке используется GIN индекс для поиска по произвольному регулярному выражению. Индекс делаешь один раз на колонку, а потом можешь по нему любыми регулярками искать.
Когда-то будучи студентом-первокурсником пытался реализовать разбор по регулярному выражению через конечные автоматы. С литературой и библиотеками кода тогда было очень туго, потому делал сам и потратил уйму времени. Помню, что проблемой было не построить конечный автомат, а его обойти, избегнув зацикленности (всё портят пустые переходы без считывания символов). И, на сколько мне помнится, простого решения данной проблемы мне придумать тогда не удалось. Не совсем понял, как решается эта проблема у автора статьи?
Можно потом этот автомат преобразовать: удалить лямбда-переходы (или построить сразу автомат Глушкова), минимизировать его. У автора в re2, насколько я помню, делается так: определяется доля автомата, начиная с которой строится НКА, соединяющий несколько ДКА. Регулируя это, можно управлять trade-off «размер автомата» vs «эффективность».
Выходит что PCRE с его мудреным оптимизатором и JIT прям в машинный код под кучу архитектур — чуть ли не самый тормоз?
Не все возможности PCRE можно реализовать в описанном в статье подходе.
Там может стоило бы сделать, чтобы конкретная реализация выбиралась динамически в зависимости от реального содержимого регулярки?
Да, и автор как раз призывает использовать такой подход:
Но даже в этом случае есть смысл использовать для большинства РВ алгоритм Thompson NFA, применяя бэктрекинг лишь в случае необходимости. Лучше всего прибегать к бэктрекингу только для размещения обратных ссылок.
Можно вопрос, а как обстоят дела со скоростью у движков javascript по сравнению с остальными?
Перевод некачественный, пришлось читать оригинал. Например, в самом начале статьи:
В первом случае поиск занимает A?nAn времени, во втором — An.
В оригинале:
Time to match a?nan against an
то есть, «Время на поиск выражения a?nan в строке an». То есть, оба графика показывают результаты одного и того же эксперимента, проведенного для двух разных алгоритмов. По-моему, переводчик вообще не понял, о чем речь :)
Sign up to leave a comment.