Добрый вечер, хабражители! Сегодня хочу поделиться небольшими перфоманс оценками ORegex .NET.
Если вы читали мою предыдущую статью здесь, то на мой взгляд было не очень убедительно представлять что-то без сравнительной оценки скорости, Вы так не считаете? Если да, то Вам под кат.
Долго думал над тем, что же включить в бенчмарк, чтобы долго себя не мучить. Не хотелось тратить на это много времени/сил, а так как фантаст и писатель из меня ну совсем никудышный, решил взять самое простое сравнение — поиск подстроки в тексте. На мой взгляд для перфоманс теста это самое лучшее решение, ведь символ тоже объект. Стоит заметить, что весь код присутствует в тестовом проекте на гит-хабе, можете запустить если Вам ну совсем делать нечего =)
Мы имеем ORegex и Regex движок от Microsoft, все что нужно это описать схожие паттерны для обеих сторон, ну и лямбды на каждый символ для ORegex, и надо не забыть придумать тестовые кейзы. Долго думать не пришлось, было решено посмотреть, как инструменты справятся с тремя задачами:
- Реальность (Распарсить html теги, хорошая практическая проверка на сильно структурированные данные)
- Рандом (Как у них с нахождением вхождений в совершенно случайный набор данных)
- Ошибка (Никто не отменял backtracking, поэтому нужно взглянуть на наборы в которых очень обманчивые данные)
Реальность
Была выбрана страничка с новостного сайта и задана задача найти все p теги на 20 итерациях. Как и следовало ожидать — Regex впереди. Оба инструмента в начальной итерации показали примерно одинаковые результаты холодного старта. После первой итерации разность в скоростях различалась примерно в 10 раз:
ORegex pattern: {b1o}{p}{b1c}.*?{b1o}{slash}{p}{b1c}; Regex pattern: <p
>.*?</p
>
№ | ORegex | Regex | Ratio |
---|---|---|---|
1 | 00:00:00.0040204 | 00:00:00.0058571 | 1,46 |
2 | 00:00:00.0030944 | 00:00:00.0003172 | 0,1 |
3 | 00:00:00.0032093 | 00:00:00.0003195 | 0,1 |
4 | 00:00:00.0031040 | 00:00:00.0003172 | 0,1 |
5 | 00:00:00.0032354 | 00:00:00.0003149 | 0,1 |
6 | 00:00:00.0031703 | 00:00:00.0003153 | 0,1 |
7 | 00:00:00.0031220 | 00:00:00.0003187 | 0,1 |
8 | 00:00:00.0030883 | 00:00:00.0003187 | 0,1 |
9 | 00:00:00.0036790 | 00:00:00.0003674 | 0,1 |
10 | 00:00:00.0030902 | 00:00:00.0003145 | 0,1 |
11 | 00:00:00.0030787 | 00:00:00.0003130 | 0,1 |
12 | 00:00:00.0030752 | 00:00:00.0003149 | 0,1 |
13 | 00:00:00.0030975 | 00:00:00.0003183 | 0,1 |
14 | 00:00:00.0032250 | 00:00:00.0003777 | 0,12 |
15 | 00:00:00.0031166 | 00:00:00.0003179 | 0,1 |
16 | 00:00:00.0030852 | 00:00:00.0003141 | 0,1 |
17 | 00:00:00.0031178 | 00:00:00.0003160 | 0,1 |
18 | 00:00:00.0030913 | 00:00:00.0003160 | 0,1 |
19 | 00:00:00.0030787 | 00:00:00.0003133 | 0,1 |
20 | 00:00:00.0030818 | 00:00:00.0003118 | 0,1 |
Рандом
Далее стоит посмотреть какова будет разница если данные вообще не поддаются никакой логике. Для теста был создан файл с совершенно беспорядочным набором из заданных символов:
ORegex pattern: {a}({b}{a})+; Regex pattern: a(ba)+
№ | ORegex | Regex | Ratio |
---|---|---|---|
1 | 00:00:00.1785877 | 00:00:00.0622146 | 0,35 |
2 | 00:00:00.2141055 | 00:00:00.0578735 | 0,27 |
3 | 00:00:00.2148457 | 00:00:00.0539055 | 0,25 |
4 | 00:00:00.1984781 | 00:00:00.0499280 | 0,25 |
5 | 00:00:00.2073454 | 00:00:00.0634693 | 0,31 |
6 | 00:00:00.1592644 | 00:00:00.0842834 | 0,53 |
7 | 00:00:00.2167805 | 00:00:00.0527719 | 0,24 |
8 | 00:00:00.2012316 | 00:00:00.0511291 | 0,25 |
9 | 00:00:00.1928555 | 00:00:00.0504931 | 0,26 |
10 | 00:00:00.1887427 | 00:00:00.0546691 | 0,29 |
11 | 00:00:00.1663168 | 00:00:00.0741461 | 0,45 |
12 | 00:00:00.1628335 | 00:00:00.0742250 | 0,46 |
13 | 00:00:00.2077626 | 00:00:00.0481913 | 0,23 |
14 | 00:00:00.1709487 | 00:00:00.0501648 | 0,29 |
15 | 00:00:00.1869102 | 00:00:00.0477373 | 0,26 |
16 | 00:00:00.2173555 | 00:00:00.0629728 | 0,29 |
17 | 00:00:00.1897196 | 00:00:00.0495571 | 0,26 |
18 | 00:00:00.1939370 | 00:00:00.0494173 | 0,25 |
19 | 00:00:00.2249846 | 00:00:00.0479044 | 0,21 |
20 | 00:00:00.2037242 | 00:00:00.0815932 | 0,4 |
В данном случае отставание ORegex от Regex лишь примерно в три раза.
Ошибка
Чтож, на данный момент ясно, что ORegex проигрывает в нахождении символьных последовательностей в сильно структурированных данных и случайных наборах, но как насчет ошибочных случаев? Тест простой, насколько два инструменты bactracking-пруфф. Для этого был задан специальный шаблон, а размер строки из одних 'x' постепенно увеличивался на 150 символов, в итоге при третьей итерации, Regex отстал практически в 30 раз:
ORegex pattern: {x}+{x}+{y}+; Regex pattern: x+x+y+
№ | ORegex | Regex | Ratio |
---|---|---|---|
1 | 00:00:00.0082144 | 00:00:00.0094231 | 1,15 |
2 | 00:00:00.0005045 | 00:00:00.0064406 | 12,76 |
3 | 00:00:00.0114383 | 00:00:00.3322330 | 29,05 |
Итоги
Подводя итоги, хочу сказать, что конечно же, использовать для поиска подстроки данный инструмент неразумно и глупо. Для этого есть более быстрые regex движки. Если же задача стоит быстро, просто и понятно найти шаблон в последовательности объектов (геном в последовательности генов, простые сущности в словах, объект в дампе памяти и т.д.), то такие различия в скорости на мой взгляд вполне допустимы.
На этом все. Спасибо за внимание и терпение! =)
xystarcha
Что больше всего огорчает в этом проекте, так это лицензия.
kekekeks
Делать библиотеки под GPL — особая форма изуверства и человеконенавистничества. Посмотреть можно, а использовать нельзя.
starius
Публиковать ПО с закрытым кодом — особая форма изуверства и человеконенавистничества. Посмотреть можно, а использовать нельзя.
kekekeks
Да почему же нельзя? Покупайте и пользуйтесь. В случае же с библиотеками под GPL (без двойного лицензирования с возможностью приобрести за денежку) человек буквальным образом пытается навязать свою веру окружающим. Хочешь использовать — принимай веру и выпускай уже свой продукт под GPL. Так же это часто сопровождается религиозными фанатичными высказываниями в пользу OSS. Выкладывающие библиотеки под GPL мне чем-то напоминают последователей радикального ислама.
С программами под GPL такой проблемы нет. Там эта лицензия выполняет ту же функцию, что LGPL для библиотек — принуждает к открытию всех модификаций исходного кода, что, в общем-то, вполне понятное и разумное решение со стороны автора и приносит пользу обществу, при этом ни к чему не принуждая людей, которые просто используют код, не модифицируя его.
eocron
А можно поподробнее, разу уж встала проблема с лицензией? Я просто не спец в вопросах лицензирования и ставил GNU GPL из соображений «делайте, что хотите на ваше усмотрение». А оказывается овчинка когти скрывает?
kekekeks
Суть в чём — если у вас библиотека под GPL, то по условиям этой самой GPL любая программа, которая библиотеку использует, считается производным произведением и должна тоже быть выпущена под GPL. LGPL несёт меньше проблем, т. к. допускает динамическую линковку (библиотека должна лежать рядом отдельным файлом) с закрытым кодом.
«Делайте что хотите на ваше усмотрение» — это BSD/MIT/Apache-лицензии, которые допускают использование кода любым способом и требуют лишь указывать, что использован код за авторством такого-то человека или группы лиц.
Соответственно выпуск библиотек под GPL имеет хоть какой-то смысл в двух случаях:
Надо бы на эту тему заметку с ликбезом сделать, вот что.
eocron
Благодарю, теперь более-менее понятно. Получается, что нужно просто поменять лицензию на BSD. Так что, вопрос человеконенавсничества просто пропадет, ибо делал не только для себя )
Насчет заметки: лучше сделать краткую таблицу. Серьезно, эти лиценз-шиты и так огромны, и читать их ну вообще не охота.
kets
Я думаю, что вот этот сайт (tldrlegal.com) подойдёт для разбора разных лицензий.
starius
Если сравнить "проблемы" от (L)GPL с проблемами от их отсутствия (бинари без исходников, даже за деньги), то уж лучше GPL. Кроме того, GPL ни к чему не принуждает, если автор зависимостого софта его использует для внутренних нужд и не публикует. Единственное, чему противостоит GPL — это публикации бинарей без исходников, то есть злу куда большему, чем сам GPL.
Да и есть проблема-то от GPL? Надо просто публиковать свои исходники под той же лицензией, что и зависимости. У меня такое правило: если завишу только от софта с MIT-подобными лицензиями, то публикую под MIT. А если среди зависимостей есть библиотека под GPL, то публикую под GPL. И ни разу не сталкивался с проблемами при таком подходе.
Cryvage
Это если проект свой. А если я пишу код для кого-то другого? Все-таки LGPL является более разумным компромиссом. Лично у меня такое мнение: если библиотека является основополагающей для твоей программы, ее ядром, так сказать, тогда да, разумно наследовать лицензию этой библиотеки. А если это маленькая библиотека, реализующая какую-то небольшую функцию, то она не должна влиять на лицензию остального кода.
alexeyrom
А у меня возник такой вопрос: не пользовались ли вы (не в этом проекте, а вообще) случайно библиотеками под GPL, считая, что они позволяют делать «что хотите на ваше усмотрение»?
eocron
Провокационный вопрос.
starius
Не сбивайте с толку выбравших GPL, пожалуйста.
Чтобы пользоваться, нужен доступ к исходникам. А то преположим компания X возьмёт эту библиотеку, внесёт в неё изменение и будет продавать бинари с хедерами — хорошо будет? Даже купив бинари под винду, я не смогу использовать библиотеку под линукс (а из исходников — собрал бы!).
Или ещё того хуже: сделает программу, в которую статически влинкует эту библиотеку, и будет продавать бинари без исходников. От всех этих нечестных способ использования GPL и защищает, а FSF критикует использование LGPL для библиотек.
Если уж на то пошло, то больба что с тем, что с другим более вредна, чем исходное явление. А на самом деле сторонники GPL — это атеисты, не желающие верить в то, что код будет открыт, если будет возможность его не открыть.
AxisPod
Есть, пить, иметь жилье — особая форма изуверства и человеконенавистничества. Посмотреть, понюхать можно, а есть и пить нельзя.
starius
Это не в ту степь немного. Владение всем этим (еда, напитки, жильё) не даёт исключительных прав на эти блага. То есть мой бутерброд никак не мешает вам получить свой такой же. Потому что все копии еды, напитков и жилья универсальны с точки зрения возможности их съесть, понюхать и поселиться. А вот с кодом (и вообще копирайтом) не так — там действуют исключительные права, гарантирующие отсутствие этого права у всех других. Владеет кто-то исходниками, а миру даёт только бинари (даёт "посмотреть"). А получить исходники (то есть "воспользоваться") — ни-ни. Логично, что возникает копилефт как способ направить копирайт против себя же.
eocron
Больше не огорчает =)
xystarcha
Спасибо! Теперь будем смотреть :)