2012-02-21 23 views
10

Tengo una aplicación en ejecución que mira elementos en una cola, luego, en función de ciertas palabras clave se aplica una categoría, luego se inserta en una base de datos.¿Está utilizando una expresión regular más rápido que IndexOf?

Estoy usando IndexOf para determinar si hay una determinada palabra clave presente.

¿Es esta la manera ideal o un RegEX sería más rápido?

Se procesan unos 10 elementos por segundo aproximadamente.

+6

Debe probar ambos enfoques y medir lo que es más rápido. Además, 10 veces por segundo no es nada, no debe preocuparse por las actuaciones aquí. – ken2k

+2

Además, necesitaríamos saber más sobre la complejidad relativa del análisis sintáctico. Si necesita llamar a String.IndexOf 10 veces para lograr el mismo efecto que el RegEx, la relación de rendimiento será diferente que si es 1 para 1. –

+1

10 elementos por segundo no es nada? ¿Cuándo comenzarías realmente a preocuparte por el rendimiento? –

Respuesta

15

Para simplemente encontrar una palabra clave, el método IndexOf es más rápido que usar una expresión regular. Las expresiones regulares son potentes, pero su poder radica en la flexibilidad, no en la velocidad bruta. No superan los métodos de cuerda en operaciones de cuerda simples.

De todos modos, si las cuerdas no son enormes, no debería importar ya que no lo haces con tanta frecuencia.

1

En primer lugar, con 10 elementos por segundo, probablemente ni siquiera necesite pensar en sobre el rendimiento.

IndexOf es probablemente más rápido que la expresión regular en la mayoría de los casos. Especialmente si no usas una expresión regular precompilada.

Su rendimiento también puede depender de la comparación/cultura de cuerdas elegida. Espero que StringComparison.Ordinal sea el más rápido.

2

Lo dudo - indexOf es un algoritmo muy simple que solo buscará a través de su cadena y devolverá la primera ocurrencia que encuentre.

Regex es un mecanismo mucho más complejo que necesita analizarse y verificarse con toda la cadena. Si su cadena es muy grande, estará mejor con indexOf.

1

¿Por qué no experimentar y medir el tiempo transcurrido utilizando la clase System.Diagnostics.Stopwatch? http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Configure un objeto Cronómetro antes de su operación IndexOf y luego mida el tiempo transcurrido después. Luego, cambie el índice de una expresión regular. ¡Finalmente, infórmenos de sus hallazgos para que podamos verlos también!

1

¡Al menos este programador encuentra que es más rápido entender el código que usa IndexOf!

¿Ahorrar un poco de tiempo de CPU justifica poner el tiempo que le lleva a la siguiente persona entender el código?

+1

Una expresión regular que encontraría la primera aparición de una cadena para emular 'indexOf' no pondría a ningún programador en serio problema si quisiera entenderlo. –

+0

@FlorianPeschka, acordó que el costo es bajo, pero todavía hay un costo de mirar el RegEx. –

+1

RegEx.Match es difícil de entender? –

3

La única manera de que lo sepa con certeza es testeándolo. Pero hacer una conjetura informada depende de la cantidad de palabras clave que esté evaluando, la longitud del texto, etc. El índice probablemente gane.

La única forma de que esté seguro es escribir una prueba para su situación específica.

Cuestiones relacionadas