Эффективность регулярных выражений: Boost против Perl
Я ищу сравнение производительности между perl и boost регулярным выражением.
Мне нужно создать кусок кода, который очень сильно зависит от регулярных выражений и может выбирать между:
- выполняется через регулярное выражение boost
- отправка интерпретатора perl и выполнение работы в perl
Я знаю, что perl известен своей оптимизированной строковой обработкой. Тем не менее, я не могу найти сравнение производительности, чтобы увеличить библиотеку регулярных выражений.
Знаете ли вы о таком сравнении?
Благодаря
Ответы
Ответ 1
Начальная стоимость запуска интерпретатора Perl из вашего приложения (с помощью системной функции, которую я предполагаю) перевешивает все преимущества, которые вы получаете, используя движок regex Perl. Исключение было бы, если бы у вас было ОЧЕНЬ сложное регулярное выражение, что реализация регулярного выражения Perl, вероятно, будет оптимизирована, но ускорить двигатель регулярных выражений не будет.
Настоящий ответ заключается в том, что я не знаю такого сравнения, но средства регулярного выражения Perl не обязательно являются самыми быстрыми. См. здесь для получения некоторой информации об алгоритме, который превосходит регулярное выражение Perl для некоторых выражений.
EDIT: можно преодолеть начальную стоимость запуска полного интерпретатора perl, связав его с libperl или используя libPCRE. И использование boost, вероятно, даст вам больше возможностей для гибкости и настройки производительности, если вам это нужно.
Заключительное примечание: нет прямых сравнений между boost.regex и Perl regex с точки зрения производительности. Решение состоит в том, чтобы попробовать и посмотреть, что более эффективно для конкретной ситуации в OP.
(Изменить: теперь есть хорошее сравнение между Boost и PCRE. См. http://www.boost.org/doc/libs/1_41_0/libs/regex/doc/gcc-performance.html)
Ответ 2
Если вы еще этого не видели, там есть регулярный ориентир в переименовании больших языков. Он не оценивает Perl очень высоко. Реализация Boost с использованием boost::xpressive
занимает первое место (которое предварительно компилирует выражение во время компиляции). Тем не менее, это микробиблиотека, поэтому, вероятно, она не является показателем общей скорости регулярного выражения, но все же стоит посмотреть.
Удивительно, но, по-видимому, самым быстрым движком регулярных выражений является Google Chrome V8 JavaScript JIT (почти превосходит GCC в режиме настенных часов, используя только одно процессорное ядро)
Ответ 3
Если ваши регулярные выражения фиксированы во время компиляции, вы также можете рассмотреть Boost.XPressive. Это позволяет писать регулярные выражения в виде шаблонов выражений, которые анализируются во время компиляции.
Ответ 4
Начните с самого простого решения. Решите, как быстро это должно быть для вашего приложения. Затем измерьте скорость. Если он слишком медленный, попробуйте более сложное решение. Повторите измерение. При необходимости повторите.
В то время как моя кишка соглашается с большинством других ответов, говоря, что запуск интерпретатора будет дороже, вы никогда не узнаете, пока не заметите.
Там "максимально быстрый" и "достаточно быстрый для вашего приложения". Не добавляйте сложность, чтобы получить первую, если у вас уже есть последняя.
Ответ 5
Если ваше регулярное выражение безумно сложное (для которого движок регулярного выражения perl невероятно быстрый, кстати), то, как говорили другие, ваши служебные данные находятся в запуске интерпретатора. С другой стороны, вы можете запустить постоянный perl, который обеспечивает сервер regex довольно легко.
Ответ 6
Если вам действительно нужно быстро, вы можете получить сопроцессор содержимого REGEX. Есть два, о которых я знаю. Titanic создает ряд процессоров. Другой - Cavium. И, наконец, LSI выкупила небольшую компанию и отправляет линейку совместимых с регулярными выражениями процессоров.
Эти системы могут выполнять тысячи регулярных выражений параллельно, а не однократно. Самой дорогой частью их использования является перемещение памяти и перемещение их назад, а также ограничение блокировки и т.д.
Но если производительность является проблемой, вы можете попробовать это.
Ответ 7
Интерпретатор perl будет фиксированной стоимостью. Если время, затрачиваемое на запуск ваших данных через интерпретатор, значительно перевешивает затраты на переводчика (т.е. У вас много данных), у вас будет повышение производительности.
Вероятно, что вы лучше всего используете чистый С++ здесь, только из-за вызова процесса.
Извините, у меня нет данных. Любовь, чтобы увидеть ваши результаты теста, хотя.