2009-11-18 24 views
13

Estoy buscando una comparación de rendimiento entre perl y aumentar la expresión regular.
tengo que diseñar una pieza de código que se basa en gran medida en las expresiones regulares, y puede elegir entre:Rendimiento de expresiones regulares: Boost vs. Perl

  1. ejecución a través de una expresión regular impulso
  2. el envío de un intérprete de Perl y hacer el trabajo en Perl

Sé que Perl es conocido por su procesamiento optimizado de cadenas. Sin embargo, no puedo encontrar una comparación de rendimiento para aumentar la biblioteca de expresiones regulares.
¿Conoces alguna de estas comparaciones?
Gracias

+2

Cuando pregunta por las expresiones regulares de Perl, ¿está preguntando sobre el intérprete de Perl o PCRE (expresiones regulares compatibles con Perl)? –

+0

PCRE probablemente sea muy bueno para usted. Sin embargo, si realmente lo necesita, también puede hacer un enlace a Perl y obtener acceso a su regex interno. Sin embargo, no hay garantías sobre la usabilidad de la API. –

+1

Prueba ambos. El tipo particular de expresiones regulares que necesita y los datos harán una gran diferencia. – igouy

Respuesta

12

El costo inicial de funcionamiento de un intérprete de Perl desde dentro de su aplicación (a través de la función del sistema, supongo) superará cualquier beneficio que obtenga sobre el uso del motor de expresiones regulares de Perl. La excepción sería si tiene una expresión regular MUY complicada que la implementación de la expresión regular de Perl está optimizada, pero el motor de regex de boost no lo está.

La respuesta real es que no conozco ninguna comparación, pero las instalaciones de expresión regular de Perl no son necesariamente las más rápidas. Consulte here para obtener información acerca de un algoritmo que supera la expresión regular de Perl para algunas expresiones.

EDITAR: Es posible superar el costo de inicio de iniciar un intérprete completo de perl mediante el enlace a libperl o usando libPCRE. Y usar boost probablemente le dará más flexibilidad y opciones de ajuste de rendimiento si los necesita.

Final Nota: No se conocen comparaciones directas entre boost.regex y Perl's regex en términos de rendimiento. La solución es probar ambos y ver cuál es más eficiente para la situación específica del OP.

(Edit:. Ahora hay una buena comparación entre Boost y PCRE Ver http://www.boost.org/doc/libs/1_41_0/libs/regex/doc/gcc-performance.html)

+1

También puede vincular a libperl y usar las expresiones regulares de Perl sin tener el sobrecarga del intérprete completo de Perl.La API puede no estar diseñada para eso, pero ciertamente es posible. –

+0

También hay libPCRE: http://www.pcre.org/ – greyfade

+1

Técnicamente, PCRE tiene algunas pequeñas diferencias con respecto a las expresiones regulares de Perl, pero son casos extremos. Apostaría que las expresiones regulares de Perl son ligeramente más rápidas, pero dudo que importe. –

8

Si aún no lo ha visto, hay un regexp benchmark in the Great Language Shootout. No clasifica a Perl muy alto en absoluto. Una implementación de Boost usando boost::xpressive se clasifica primero (que precompila la expresión en tiempo de compilación). Sin embargo, este es un microbenchmark, por lo que probablemente no sea representativo de la velocidad de expresión regular general, pero aún vale la pena verlo.

Sorprendentemente, al parecer, el motor de expresiones regulares más rápido, con mucho, es V8 JavaScript JIT de Google Chrome (casi supera a GCC en el tiempo del reloj de pared, la utilización de un solo núcleo de la CPU)

+3

Tengo serias dudas de que la referencia regex sea precisa. Nunca he visto que el motor de expresiones regulares de Python supere al de Perl. –

+1

Alguien ha aportado una referencia de Boost ahora, y está en primer lugar. ¿Alguien contribuyó esto hoy? –

+2

Además, hay dos versiones de Perl que se encuentran en la sección "Alternativas interesantes" que son más rápidas que cualquier otra cosa. –

0

El intérprete Perl va a ser un costo fijo. Si el tiempo ahorrado mediante la ejecución de sus datos a través del intérprete supera con creces los costos del intérprete (es decir, tiene muchos datos), tendrá un impulso en el rendimiento.

Es probable que sea el mejor con C++ puro aquí, solo por la invocación del proceso.

Lo sentimos, no tengo los datos. Me encanta ver los resultados de tus pruebas.

2

A menos que su expresión regular sea increíblemente compleja (para la cual el motor de expresiones regulares de perl es increíblemente rápido), entonces, como otros han dicho, su sobrecarga está en el inicio del intérprete. Por otro lado, podría ejecutar un perl persistente que proporciona un servidor regex con bastante facilidad.

6

Si sus expresiones regulares son corregidas en tiempo de compilación, también podría considerar Boost.XPressive. Permite escribir expresiones regulares como plantillas de expresión que se analizan en tiempo de compilación.

3

Comience con la solución más simple. Decida qué tan rápido debe ser para su aplicación. Luego mida la velocidad. Si es demasiado lento, pruebe la solución más difícil. Medir de nuevo. Repita según sea necesario.

Aunque mi instinto concuerda con la mayoría de las otras respuestas que dicen que comenzar el intérprete será más caro, nunca lo sabrás hasta que lo midas.

Hay "lo más rápido posible" y "lo suficientemente rápido para su aplicación". No agregue complejidad para obtener el primero si ya tiene el último.

+0

PCRE-JIT es el más rápido que existe, pero le falta la optimización de texto (la función de estudio de Perl) y eso puede tener un gran impacto en algunas aplicaciones. –

1

Si realmente lo necesita rápido, puede obtener un coprocesador de contenido REGEX. Hay dos que yo sé. Titanic hace una gama de procesadores. Otro se hace por Cavium. Y finalmente, LSI compró una compañía más pequeña y está enviando una línea de regular expression matching processors.

Estos sistemas pueden ejecutar miles de expresiones regulares en paralelo, en lugar de uno a la vez. La parte más costosa de usarlos es moverles la memoria y moverlos hacia atrás, y lidiar con los límites de bloque, etc.

Pero si el rendimiento es una preocupación, es posible que desee probar esto.

+0

¡Un poco más de lo que necesito, pero realmente interesante! ¡Gracias! –

Cuestiones relacionadas