image


Добрый вечер, хабражители! Сегодня хочу поделиться небольшими перфоманс оценками ORegex .NET.
Если вы читали мою предыдущую статью здесь, то на мой взгляд было не очень убедительно представлять что-то без сравнительной оценки скорости, Вы так не считаете? Если да, то Вам под кат.


Долго думал над тем, что же включить в бенчмарк, чтобы долго себя не мучить. Не хотелось тратить на это много времени/сил, а так как фантаст и писатель из меня ну совсем никудышный, решил взять самое простое сравнение — поиск подстроки в тексте. На мой взгляд для перфоманс теста это самое лучшее решение, ведь символ тоже объект. Стоит заметить, что весь код присутствует в тестовом проекте на гит-хабе, можете запустить если Вам ну совсем делать нечего =)


Мы имеем ORegex и Regex движок от Microsoft, все что нужно это описать схожие паттерны для обеих сторон, ну и лямбды на каждый символ для ORegex, и надо не забыть придумать тестовые кейзы. Долго думать не пришлось, было решено посмотреть, как инструменты справятся с тремя задачами:


  1. Реальность (Распарсить html теги, хорошая практическая проверка на сильно структурированные данные)
  2. Рандом (Как у них с нахождением вхождений в совершенно случайный набор данных)
  3. Ошибка (Никто не отменял 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 движки. Если же задача стоит быстро, просто и понятно найти шаблон в последовательности объектов (геном в последовательности генов, простые сущности в словах, объект в дампе памяти и т.д.), то такие различия в скорости на мой взгляд вполне допустимы.
На этом все. Спасибо за внимание и терпение! =)

Поделиться с друзьями
-->

Комментарии (17)


  1. xystarcha
    08.07.2016 15:11
    +1

    Что больше всего огорчает в этом проекте, так это лицензия.


    1. kekekeks
      08.07.2016 19:48
      +1

      Делать библиотеки под GPL — особая форма изуверства и человеконенавистничества. Посмотреть можно, а использовать нельзя.


      1. starius
        09.07.2016 02:42
        -3

        Публиковать ПО с закрытым кодом — особая форма изуверства и человеконенавистничества. Посмотреть можно, а использовать нельзя.


        1. kekekeks
          09.07.2016 08:45
          +1

          Да почему же нельзя? Покупайте и пользуйтесь. В случае же с библиотеками под GPL (без двойного лицензирования с возможностью приобрести за денежку) человек буквальным образом пытается навязать свою веру окружающим. Хочешь использовать — принимай веру и выпускай уже свой продукт под GPL. Так же это часто сопровождается религиозными фанатичными высказываниями в пользу OSS. Выкладывающие библиотеки под GPL мне чем-то напоминают последователей радикального ислама.

          С программами под GPL такой проблемы нет. Там эта лицензия выполняет ту же функцию, что LGPL для библиотек — принуждает к открытию всех модификаций исходного кода, что, в общем-то, вполне понятное и разумное решение со стороны автора и приносит пользу обществу, при этом ни к чему не принуждая людей, которые просто используют код, не модифицируя его.


          1. eocron
            09.07.2016 10:49

            А можно поподробнее, разу уж встала проблема с лицензией? Я просто не спец в вопросах лицензирования и ставил GNU GPL из соображений «делайте, что хотите на ваше усмотрение». А оказывается овчинка когти скрывает?


            1. kekekeks
              09.07.2016 10:57

              Суть в чём — если у вас библиотека под GPL, то по условиям этой самой GPL любая программа, которая библиотеку использует, считается производным произведением и должна тоже быть выпущена под GPL. LGPL несёт меньше проблем, т. к. допускает динамическую линковку (библиотека должна лежать рядом отдельным файлом) с закрытым кодом.
              «Делайте что хотите на ваше усмотрение» — это BSD/MIT/Apache-лицензии, которые допускают использование кода любым способом и требуют лишь указывать, что использован код за авторством такого-то человека или группы лиц.
              Соответственно выпуск библиотек под GPL имеет хоть какой-то смысл в двух случаях:

              • если хочется дать возможность бесплатно пользоваться библиотекой в открытом ПО с GPL-лицензией, а для остальных сделать её платной
              • если автора покусал Столлман и он теперь считает, что весь софт на планете должен быть под GPL


              Надо бы на эту тему заметку с ликбезом сделать, вот что.


              1. eocron
                09.07.2016 11:02

                Благодарю, теперь более-менее понятно. Получается, что нужно просто поменять лицензию на BSD. Так что, вопрос человеконенавсничества просто пропадет, ибо делал не только для себя )

                Насчет заметки: лучше сделать краткую таблицу. Серьезно, эти лиценз-шиты и так огромны, и читать их ну вообще не охота.


                1. kets
                  09.07.2016 12:28

                  Я думаю, что вот этот сайт (tldrlegal.com) подойдёт для разбора разных лицензий.


              1. starius
                09.07.2016 12:47
                -1

                Если сравнить "проблемы" от (L)GPL с проблемами от их отсутствия (бинари без исходников, даже за деньги), то уж лучше GPL. Кроме того, GPL ни к чему не принуждает, если автор зависимостого софта его использует для внутренних нужд и не публикует. Единственное, чему противостоит GPL — это публикации бинарей без исходников, то есть злу куда большему, чем сам GPL.


                Да и есть проблема-то от GPL? Надо просто публиковать свои исходники под той же лицензией, что и зависимости. У меня такое правило: если завишу только от софта с MIT-подобными лицензиями, то публикую под MIT. А если среди зависимостей есть библиотека под GPL, то публикую под GPL. И ни разу не сталкивался с проблемами при таком подходе.


                1. Cryvage
                  09.07.2016 18:34
                  +1

                  Это если проект свой. А если я пишу код для кого-то другого? Все-таки LGPL является более разумным компромиссом. Лично у меня такое мнение: если библиотека является основополагающей для твоей программы, ее ядром, так сказать, тогда да, разумно наследовать лицензию этой библиотеки. А если это маленькая библиотека, реализующая какую-то небольшую функцию, то она не должна влиять на лицензию остального кода.


            1. alexeyrom
              09.07.2016 19:03

              А у меня возник такой вопрос: не пользовались ли вы (не в этом проекте, а вообще) случайно библиотеками под GPL, считая, что они позволяют делать «что хотите на ваше усмотрение»?


              1. eocron
                10.07.2016 12:50

                Провокационный вопрос.


          1. starius
            09.07.2016 12:02
            -1

            Не сбивайте с толку выбравших GPL, пожалуйста.


            Покупайте и пользуйтесь.

            Чтобы пользоваться, нужен доступ к исходникам. А то преположим компания X возьмёт эту библиотеку, внесёт в неё изменение и будет продавать бинари с хедерами — хорошо будет? Даже купив бинари под винду, я не смогу использовать библиотеку под линукс (а из исходников — собрал бы!).


            Или ещё того хуже: сделает программу, в которую статически влинкует эту библиотеку, и будет продавать бинари без исходников. От всех этих нечестных способ использования GPL и защищает, а FSF критикует использование LGPL для библиотек.


            Выкладывающие библиотеки под GPL мне чем-то напоминают последователей радикального ислама.

            Если уж на то пошло, то больба что с тем, что с другим более вредна, чем исходное явление. А на самом деле сторонники GPL — это атеисты, не желающие верить в то, что код будет открыт, если будет возможность его не открыть.


        1. AxisPod
          09.07.2016 12:38
          +1

          Есть, пить, иметь жилье — особая форма изуверства и человеконенавистничества. Посмотреть, понюхать можно, а есть и пить нельзя.


          1. starius
            09.07.2016 12:55
            -1

            Это не в ту степь немного. Владение всем этим (еда, напитки, жильё) не даёт исключительных прав на эти блага. То есть мой бутерброд никак не мешает вам получить свой такой же. Потому что все копии еды, напитков и жилья универсальны с точки зрения возможности их съесть, понюхать и поселиться. А вот с кодом (и вообще копирайтом) не так — там действуют исключительные права, гарантирующие отсутствие этого права у всех других. Владеет кто-то исходниками, а миру даёт только бинари (даёт "посмотреть"). А получить исходники (то есть "воспользоваться") — ни-ни. Логично, что возникает копилефт как способ направить копирайт против себя же.


    1. eocron
      09.07.2016 11:18

      Больше не огорчает =)


      1. xystarcha
        11.07.2016 12:32

        Спасибо! Теперь будем смотреть :)