2010-04-05 18 views
6

por escrito un motor de scripting, tengo funciones como (pseudo-código)Comparación Regex vs. Manual. ¿Cual es mas rápido?

function is_whitespace?(char c){ 
    return c==' ' || c=='\t' || c=='\r' || c=='\n'; 
} 

Bueno, mi pregunta es que es más rápido en la mayoría de langugaes? Eso o el uso de expresiones regulares como

function is_whitespace?(char c){ 
    return regex_match('\s',c); 
} 

Los principales idiomas que me preocupa son C#, C, y Ruby también en caso de que sea completamente dependiente de la plataforma.

+2

Parece lo suficientemente simple como para preparar una prueba rápida para averiguarlo. Genere un archivo lleno de caracteres aleatorios y páselo a través de ambas funciones. –

+0

Creo que significaba '\ s' en lugar de '\ w' allí. – sepp2k

+0

sí, eso es cierto ... Mono tendrá que ser suficiente para la prueba de C# aunque ... – Earlz

Respuesta

11

Por supuesto, cuatro comparaciones de trozos pequeños de memoria son mucho más rápidos (y casi no utilizan memoria) que construir, ejecutar y destruir una máquina de estados.

+0

+1. Tenga en cuenta que los ejemplos más complicados podrían ser más rápidos para usar la expresión regular. –

+0

Bueno, ¿cuando Regex supera (ingenuamente) las comparaciones manuales? – Earlz

+3

Mi conjetura es que nunca, pero codificar manualmente un comparador para un idioma normal podría ser muy complicado en comparación con escribir una expresión regular. – danben

1

En la mayoría de los casos, la expresión regular para encontrar algo así como un carácter de espacio en blanco es muy rápida. Usted tiene muchos ojos mirando el rendimiento en las principales implementaciones de expresiones regulares y es probable que haya otras áreas de 'fruta colgando' para la optimización en otras áreas de su código.

Las áreas de bajo rendimiento de una expresión regular son expresiones regulares mal escritas. Las sugerencias son evitar tanto retroceso, agrupación y alteración innecesarios como sea posible. Use algo como "Regex Buddy" o Perl con "use re reug" para ver cuántas ramas toma su expresión regular.

Los enlaces se refieren a algunos problemas de rendimiento de expresiones regulares.

En caso de duda, hacer sincronizaciones comparativos ...

Coding Horor- Regex

Java Performance - Regex

3

La comparación manual es más rápida de ejecutar, la comparación de expresiones regulares es más rápido que escribir.

Tenga en cuenta que sus dos implementaciones no son equivalentes si su sistema utiliza Unicode. La expresión regular \s coincide con todos los espacios en blanco Unicode, mientras que su comparación manual solo maneja ASCII básico y ni siquiera incluye la pestaña vertical y los caracteres de alimentación del formulario que generalmente también se consideran espacios en blanco.

Si está escribiendo esto en un lenguaje de alto nivel, le sugiero que use la función is_whitespace() ya provista por las bibliotecas de su lenguaje de programación. Una función básica como esa casi siempre está incluida.

Así que al final la respuesta es "depende". En algunas situaciones, se justifica el esfuerzo adicional de programación de usar código de procedimiento. En muchos casos, la expresión regular es lo suficientemente rápida y fácil de mantener.

+0

¿No obstante eso no depende si su implementación de Regex es consciente de unicode? (y su idioma. Por ejemplo, creo que Ruby todavía no tiene conocimiento de unicode) – Earlz

+0

Dije: "si su sistema usa Unicode". Con eso me refería tanto al lenguaje de programación como al sabor regex. El sabor regex en Ruby 1.8 no es compatible con Unicode, el de Ruby 1.9 sí. –

1

después del uso del disco, las expresiones regulares son casi siempre mi cuello de botella de rendimiento cuando perfilo mi código. incluso para cosas simples como .split ("").

0

No puedo hablar sobre C# o C, pero no asumiría que la forma no-regex es más rápida en Ruby.