¿Cuál es la diferencia entre String.matches y Matcher.matches? ¿Hay alguna diferencia en términos de rendimiento u otras cosas?¿Cuál es la diferencia entre String.matches y Matcher.matches?
Respuesta
Absolutamente. Se crea un Matcher
en una expresión regular precompilada, mientras que String.matches
debe recompilar la expresión regular cada vez que se ejecuta, por lo que se vuelve un desperdicio más a menudo se ejecuta esa línea de código.
String.matches
llamadas internas Pattern.matches(regex, str)
. El problema es que cada vez que lo llamas, recompilas el patrón, lo que cuesta algunos recursos.
Es mejor compilar su patrón una vez, luego intente hacer coincidirlo con todas las cadenas que desee. Yo personalmente uso una clase de Patrones que contiene todo mi patrón en mi aplicación declarada como definitiva y estática
"Yo personalmente uso una clase de Patrones que contiene todo mi patrón en mi aplicación declarada como definitiva y estática." Es mejor poner los patrones en las clases o métodos donde se usan realmente. De esta forma, el código que cambia conjuntamente se empaqueta. Consulte el [Principio de cierre común] (http://c2.com/cgi/wiki?CommonClosurePrinciple). –
de hecho, estoy de acuerdo contigo. Mis opiniones han cambiado en 4 años :-) – chburd
String.matches delega internamente en Matcher.matches.
public boolean matches(String regex) {
return Pattern.matches(regex, this);
}
public static boolean matches(String regex, CharSequence input) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
return m.matches();
}
Si está reutilizando el objeto Pattern, habrá algunos beneficios de rendimiento. Además, cuando utiliza Pattern/Matcher puede group sus expresiones regulares y obtener las partes correspondientes.
La línea de fondo es si tiene una expresión regular que usará solo una vez y no necesita analizar su cadena para obtener partes coincidentes y luego usar cualquiera. Pero si vas a usar la misma expresión regular contra varias cadenas o si necesitas partes de la cadena basadas en expresiones regulares, crea un patrón y obtén Matcher usándolo.
Vea usted mismo: http://www.docjar.com/html/api/java/lang/String.java.html línea de 2101.
Por curiosidad he hecho este pequeño ensayo sobre las diferencias de tiempo. Resulta que usando un patrón precompilado es más de 5 veces más rápido que usando el método String.matches.
import java.util.regex.Pattern;
/**
* @author Rajind Ruparathna
*/
public class MatchesTest {
public static void main(String Args[]) {
String first = "@\\{message.headers\\.?([^\\}]*)\\}";
String second = "@\\{message.headers.wolla\\}";
long start, end, total;
float avg;
int NUM_OF_ITERATIONS = 100;
Pattern pattern = Pattern.compile(first);
total = 0;
start = 0;
end = 0;
avg = 0;
for (int i=0; i< NUM_OF_ITERATIONS; i++) {
start = System.nanoTime();
pattern.matcher(second).matches();
end = System.nanoTime();
total = total + (end - start);
}
avg = total/NUM_OF_ITERATIONS;
System.out.println("Duration pre compiled: " + avg);
total = 0;
start = 0;
end = 0;
avg = 0;
for (int i=0; i< NUM_OF_ITERATIONS; i++) {
start = System.nanoTime();
first.matches(second);
end = System.nanoTime();
total = total + (end - start);
}
avg = total/NUM_OF_ITERATIONS;
System.out.println("In place compiled: " + avg);
}
}
de salida (nanosegundos):
duración predeterminada de compilar: 4505,0
En lugar de compilar: 44960.0
P.S. Esta prueba es una prueba rápida y sucia, y puede no estar de acuerdo con las prácticas de evaluación comparativa del rendimiento. Si desea obtener resultados altamente precisos, utilice una herramienta de micro benchmarking.
Este es el punto de referencia que estaba buscando, ¡gracias! – Tadhg
Pattern.compile compila el patrón para que cuando ejecute metcher.matches, el patrón no se vuelva a compilar una y otra vez. Pattern.compile lo compila previamente. Sin embargo, si usa string.matches, compila el patrón cada vez que ejecuta esta línea. Entonces, es mejor usar Pattern.compile.
- 1. ¿Cuál es la diferencia entre {0} y ""?
- 2. Cuál es la diferencia entre = y: =
- 3. ¿Cuál es la diferencia entre .ToString (+) y ""
- 4. Cuál es la diferencia entre $ (...) y `...`
- 5. ¿cuál es la diferencia entre:.! y: r !?
- 6. ¿Cuál es la diferencia entre ".equals" y "=="?
- 7. ¿Cuál es la diferencia entre dict() y {}?
- 8. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 9. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 10. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 11. ¿Cuál es la diferencia entre + = y = +?
- 12. ¿Cuál es la diferencia entre " " y ""?
- 13. Cuál es la diferencia entre $ y jQuery
- 14. OpenGL (ES) - ¿Cuál es la diferencia entre frustum y orto?
- 15. Cuál es la diferencia entre la función() {}() y la función() {}()
- 16. ¿Cuál es la diferencia entre la abstracción y la encapsulación?
- 17. ¿Cuál es la diferencia entre @ y $ y% en MSBuild?
- 18. ¿Cuál es la diferencia entre la vinculación estática y dinámica?
- 19. ¿Cuál es la diferencia entre la sección .got y .got.plt?
- 20. ¿Cuál es la diferencia entre el colado y la coerción?
- 21. ¿cuál es la diferencia entre el complemento y la biblioteca?
- 22. ¿Cuál es la diferencia entre el casting y la conversión?
- 23. ¿Cuál es la diferencia entre WPF y la aplicación Silverlight?
- 24. ¿Cuál es la diferencia entre uno mismo y la ventana?
- 25. ¿Cuál es la diferencia entre CookieContainer y la colección Response.Cookies?
- 26. ¿Cuál es la diferencia entre la relación Composición y Asociación?
- 27. ¿cuál es la diferencia entre el material y la textura?
- 28. ¿Cuál es la diferencia entre el marco y la arquitectura?
- 29. ¿Cuál es la diferencia entre la carpeta vim72 y vimfiles?
- 30. ¿cuál es la diferencia entre la lex y yacc
rendimiento y http://stackoverflow.com/a/1721778/489364 – kommradHomer