Производительность различных библиотек регулярных выражений

Какая библиотека regexp быстрее? (13.44КиБ) Много читал с утра о библиотеках регулярных выражений. Хочется найти такую, чтобы работала с UTF-8, была быстрой и мощной. Без особой надежды поискал в интернете обзоры библиотек и нашёл статью «Benchmark of Regex Libraries».

Автор сравнивает по скорости обработки три регулярных выражения, правда довольно несложных, на приличного объёма тексте. Но даже и на этих несложных регулярках есть явные аутсайдеры — например, Python (хотя другие тесты дают другие результаты).

Жалко автор не составил такую же таблицу для режима UTF-8, там производительность может сильно отличаться.

Например, мне из таблицы понравилась библиотека RE2, она показывает хорошие результаты, при этом в последнем тесте вырывается далеко вперёд. Правда в ней не реализована часть синтаксиса (например, нет backreferences), но это я бы пережил. А вот насколько она эффективная в режиме UTF-8 — вопрос (вопрос тем более актуален, что библиотека показывает примерно равную с PCRE эффективность, а PCRE с UTF-8 работает медленно).

Кстати, скрипты для тестирования доступны для скачивания. Можно попробовать переключить пару библиотек в UTF-8 и посмотреть что с ними будет.

Добавлено позднее: раз доступны скрипты тестирования, я решил посмотреть не находится ли уже RE2 в режиме UTF-8 (у неё это режим по-умолчанию), оказалось, что находится:
RE2 p(argv[1]);
buf = (char*)calloc(BUF_SIZE, 1);
while (fgets(buf, BUF_SIZE - 1, stdin)) {
        ++l;
        for (q = buf; *q; ++q); if (q > buf) *(q-1) = 0;
        if (RE2::PartialMatch(buf, p))
                printf("%d:%sn", l, buf);
}
free(buf);
Чтобы выключить режим UTF-8, нужно использовать константу RE2::Latin1, а её в коде нет. Значит, RE2 работает в режиме UTF-8. Интерееесно.
22 декабря 2010 09:53

Максим (инкогнито)
22 декабря 2010, 12:15

А почему RE2 вырывается далеко вперёд, по-моему, у egrep результаты лучше.

bolk (bolknote.ru)
22 декабря 2010, 14:02, ответ предназначен Максиму

egrep, во-первых, не библиотека, во-вторых, возможности этой утилиты крайне скромны.

voldmar (voldmar.ru)
22 декабря 2010, 14:35

https://github.com/dprokoptsev/pire — смотрел?

jimidini (indeyets.ru)
22 декабря 2010, 15:17

я для юникода обычно использую oniguruma. она в php прячется в mb_ereg

она и тут в рейтинге даёт наибольшее количество самых быстрых результатов

bolk (bolknote.ru)
22 декабря 2010, 15:27, ответ предназначен voldmar (voldmar.ru):

https://github.com/dprokoptsev/pire — смотрел?
Не подходит под слово «мощная».

bolk (bolknote.ru)
22 декабря 2010, 15:35, ответ предназначен jimidini (indeyets.ru):

я для юникода обычно использую oniguruma. она в php прячется в mb_e
Я почему-то не смог заставить там работать \p{L} и им подобные конструкции. Ведёт себя так, как будто ошибка в регулярном выражении.

bolk (bolknote.ru)
22 декабря 2010, 15:37

Я пытался скомпилировать тесты для re2, но по логам увидел, что это плохая идея — там всюду используется pthreads, а с thread safe у PHP всё неоднозначно.

bolk (bolknote.ru)
22 декабря 2010, 15:50, ответ предназначен jimidini (indeyets.ru):

Та версия, которая в PHP 5.3.2 работает как-то неадекватно:
thasonic-dev ~ $ php -r 'mb_regex_encoding("Utf-8");var_dump(mb_eregi("z", "ЯZ"));'
int(1)
thasonic-dev ~ $ php -r 'mb_regex_encoding("Utf-8");var_dump(mb_eregi("я", "ЯZ"));'
bool(false)
thasonic-dev ~ $ php -r 'mb_regex_encoding("Utf-8");var_dump(mb_eregi("\p{L}", "ЯZ"));'
bool(false)
thasonic-dev ~ $ php -r 'mb_regex_encoding("Utf-8");var_dump(mb_eregi("^[[:upper:]]+$", "ЯZ"));'
int(1)

То есть какие-то части работают, другие — нет. Но с этим можно попробовать мириться.

bolk (bolknote.ru)
22 декабря 2010, 15:53

Видимо, потому что в PHP 5.3.2 вкомпилена версия 4.7.1:
* 5.x supports Unicode Property/Script.

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)