Pull to refresh

Comments 27

проверки корректности введенного пользователем URL, адреса IPv4, адреса IPv6, телефонного номера и

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

не нагуглилось наяндексилось... спасибо на наводку!

явно второй этап вырисовывается )))

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

ну там выше ссылка на pcre2 есть, я когда отвечал еще не видел того коммента. не думаю, что есть смысл смотреть на старые версии того же самого.

Ещё бы в тестировании хорошо учесть насколько библиотеки умеют в регулярки. А то "совместимость по самим правилам, хотя бы на базовом уровне" и "[...] поддерживают сокращенный набор элементов regexp" выглядит несколько расплывчато. Есть общепринятые "стандарты" языка регулярок: например Basic (BRE), Extended (ERE), Perl-совместимый (PCRE). Хорошо бы сравнивать не только скорость, но и реализованные в библиотеке фичи самих регулярок. Такой обзор был бы более полезен. Какой толк с очень быстрой библиотеки, которая реализует урезанный базовый уровень? А кому-то в своём приложении может и такого уровня хватит.

И ещё, какие лицензии у тестируемых библиотек? Это тоже немаловажно, если использовать в других проектах.

Спасибо за отзыв! Наверно, продолжение надо сделать с учетом общепринятых "стандартов", т.е. либо без примитивных реализаций, либо с разделением на лиги (любительская/профессиональная), ну, и с учетом вновь заявленных участников соревнований.
Про лицензии думал уже, надо будет добавить.

Странно, что между boost и stdlib такой разрыв, потому что «The Boost Regex library provides regular expression support for C++, this library is the ancestor to std::regex and still goes beyond and offers some advantages to, the standard version.».

Согласен. Это повод поразбираться.
Хотя, чисто формально, это в порядке вещей, ибо boost не стоит на месте.

А каким компилятором и соответственно стандартной библиотекой пользовались во время теста? Может есть смысл сравнить большую тройку компиляторов?

P.S. Нашёл в логах что GCC 11.4.0

Формально, при сборке тестовых приложений, компилятор жестко не задан - используется переменная CXX, но по факту, при сборке на виртуалке в GitHub Actions, используется gcc из пакета build-essential из ubuntu-latest.
В соревнованиях главное обеспечить равные условия, хотя зависимость от компилятора была бы интересна.

AFAIK, стандарт описывает интерфейс, но не описывает имплементацию. Соответственно в gcc libc++, clang libc++ и msvc libc++, например, могут быть совершенно разные по скорости движки для регулярных выражений. То же самое касается и других алгоритмов, например алгоритмов сортировки. Для них, стандарт, вроде бы описывает только ограничение по O большому и все.

cmake -DCMAKE_CXX_STANDARD=17 -DCMAKE_POSITION_INDEPENDENT_CODE=ON .. && cmake --build

Верно я понимаю, что по умолчанию собираем и запускаем конфигурацию Debug без оптимизаций компилятора?

Нет, это конфигурация с пустым cmake_build_type, ключи компилятора могут отличаться и от debug, и от release

Правильно было бы в явном виде указать Release.

Согласен, надо явно добавить релиз. Спасибо за комментарий!

Судя по коду, в hyperscan как раз и выполняется компиляция регулярок, поэтому повторные прогоны должны быть быстрыми - его имеет смысл сравнивать только с jit

Добавление участника pcre2 - в планах. Спасибо за комментарий!
Если есть на примете другие - предлагайте.

Проверки проводились с параметрами: NR=10, IR=20'000, ND=5, ID=10. Общее количество проверок для одного участника SUM=10'000'000

Меня смущает IR=20'000. Скажем, если в библиотеке реализовано кэширование на каком-либо уровне, она получит значительное преимущество.

Под кэшированием я понимаю что угодно, что ускоряет повторные прогоны: можно запоминать N последних результатов, можно кэшировать результат преобразования регулярного выражения из строки в более подходящую структуру данных, можно регулярное выражение представить в виде конечного автомата и запомнить его, можно скомпилировать регулярное выражение и сохранить результат компиляции.

Я не считаю такие оптимизации "нечестным преимуществом", кэширование и компиляция - отличные подходы. Но методология тестирования не учитывает, что скорость сопоставления строк с регулярными выражениями может драматически меняться в зависимости от того, повторяются ли регулярные выражения в процессе выполнения теста.

Драматически - это от английского dramatically?

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

Как эти библиотеки справляются с патологическими регулярками типа (a?)^na^n? (пример для n=5 — /a?a?a?a?a?aaaaa/ ~ "aaaaa")

Смысл существования re2 как раз в отсутствии патологий бектрекинга (https://swtch.com/~rsc/regexp/regexp1.html)

Почему stdlib настолько медленная? И за счёт чего достигается скорость?

Я думаю что основных причин две:

  1. Надо поддерживать все-все фичи описанные в стандарте. И во всех возможных комбинациях. При чем фичи не только для самих регулярных выражений, но и для строк, например.

  2. Разработчики stdlib - не разработчики движков регулярных выражений. Взять готовый чаще всего не позволит лицензия, а пилить с нуля - это еще та работа.

Sign up to leave a comment.

Articles