optimización 04

Hola, soy Liu Chao.
Última conferencia, hablo optimización objeto String, se refirió al método split (), que utiliza expresiones regulares pueden causar problemas en la espalda, en la actualidad tenemos que entender, esto es lo que era?
Antes de comenzar, Echemos un vistazo a un caso, puede ayudar a entender mejor el contenido.
En un desarrollo de proyectos de pequeña escala, me encontré con un problema de este tipo. Con el fin de promover nuevos productos, hemos desarrollado un pequeño programa, de acuerdo con el número de visitas antes de la evaluación, se espera que el evento para participar en los suscriptores 30W +, TPS (transacciones por segundo la capacidad de procesamiento) hasta aproximadamente el 3000.
Esto resulta de la interfaz I hacen micro puntos de referencia. Solía ​​usar la herramienta ab (a través de yum -y install httpd-herramientas se pueden instalar rápidamente) en otra máquina en la interfaz de petición HTTP para probar.
pico Emulate puede solicitar solicitudes de línea I / -c -n usuarios simultáneos por proporcionar, a través del TPS, RT (tiempos de respuesta por segundo) y una distribución de petición de tiempo de estos tres indicadores para medir el rendimiento de la interfaz por segundo, de la siguiente manera (Figura I es una dirección de servidor oculta parte) la figura:
Sólo hacer pruebas de rendimiento, me encontré con que el TPS ha presentado una interfaz se ha estancado, es lógico pensar que este negocio es muy simple, hay una posibilidad de que los cuellos de botella de rendimiento no es muy grande.
Rápidamente utilizado el proceso de eliminación para encontrar el problema. El primer método en el código de negocio todos los comentarios, dejando un método vacío aquí, ver cómo el rendimiento. Esto puede ser una buena manera de distinguir un marco para los problemas de rendimiento, problemas de rendimiento o código de negocio.
Me navegar rápidamente a un problema es código de negocio, verá el código de uno a uno para encontrar la causa. A continuación, voy a añadir el código en la operación de base de datos, el TPS se redujo ligeramente, pero aún no sabía la causa. Por último, el método en el método de la izquierda de Split () de funcionamiento, y por supuesto voy a dividir () después de añadir, TPS disminuido significativamente.
Sin embargo, un método split () afectará el TPS ¿Por qué? Aquí llegamos a entender el contenido siguiente expresión regular, escuela terminada la respuesta va a salir.

¿Cuáles son las expresiones regulares?

Muy básico, aquí con ustedes recordar brevemente.
Una expresión regular es un concepto en informática, muchos idiomas han logrado. Las expresiones regulares utilizan ciertos caracteres meta de buscar, la altura, y reemplazar cadenas en línea con las normas.
La construcción de un regulares caracteres elemento de sintaxis expresión, caracteres de una común, carácter estándar de caracteres definido (cuantificador), el posicionamiento de caracteres (caracteres límite) composición. Los detalles se pueden encontrar a continuación:

El motor de expresiones regulares

Las expresiones regulares son un signo escrito con fórmula normal, la fórmula para el programa analiza el establecimiento de un árbol de análisis, combinado con la implementación del motor de expresiones regulares programa genera en base a este árbol de análisis (la implementación de este programa lo llamamos máquina de estados, también conocida como máquina de estado) para el personaje de igualar.
Y aquí está el motor de expresiones regulares es un conjunto básico de algoritmos utilizados para determinar la máquina de estados.
Actualmente implementar motor de expresiones regulares de dos maneras: autómata de DFA (determinista final autómata autómata finito determinista) y autómatas (autómata finito no determinista Autómata Finito no determinista) NFA.
A modo de comparación, el costo de construcción es mucho más grande que los autómatas de DFA NFA autómata, pero la eficiencia es mayor que el autómata autómata DFA NFA.
Supongamos que la longitud de una cadena es n, si los autómatas DFA como motor de expresiones regulares, igualando la complejidad de tiempo es O (n); autómata NFA como si el motor de expresiones regulares, ya que el proceso de coincidencia NFA autómata y hay una gran cantidad de ramas de vuelta, el tiempo de hipótesis NFA es el número de estados s, entonces el algoritmo de coincidencia complejidad es O (ns).
Ventajas NFA máquina automática es apoyar más características. Por ejemplo, el grupo de captura, mirando a su alrededor, los cuantificadores posesivos y otras características avanzadas. Estas funciones se basan en sub-expresiones independientes a la altura, por lo que el lenguaje de programación, el uso regular de la biblioteca de expresión se basa en la aplicación de la NFA.
Así máquina automática NFA en la final es cómo hacerlo coincidir? Tengo los siguientes caracteres y expresiones que ilustran.
text = “aabcab”
regex = “BC”
NFA automáticamente oportunidad de leer todos los personajes de expresiones regulares, y tomar la cadena objetivo, el éxito en el juego para la siguiente expresión de carácter regular, y viceversa para continuar y siguiente cadena de caracteres de destino para que coincida. Pierde el control de procesos.
En primer lugar, leer la primera cadena de caracteres regular y el primer carácter coincide con una de las expresiones se comparan, b para una, desajuste, continúe con el siguiente transductor cadena de caracteres, es un desajuste; continuar una reemplazado es b, partido.
Entonces, de manera similar, el cuarto de lectura de caracteres a juego regular de una segunda cadena de símbolos y la comparación de la expresión, C para C, a juego; continuar leyendo la expresión regular siguiente carácter, sin embargo, no tiene partidos espalda carácter, y al final.
Este es el proceso de correspondencia máquina automática NFA, aunque en las aplicaciones prácticas, se encontró con las expresiones regulares para ser más complejo que eso, pero método de emparejamiento es el mismo.

Backtracking NFA máquina automática

Más compleja ser implementado con autómatas expresiones NFA en el proceso de correspondencia a menudo causa problemas en la espalda. Una gran cantidad de retroceso tiempo ocupará de la CPU, con lo que la sobrecarga de rendimiento del sistema. Permítanme ilustrar.
text = “abbc”
regex = “ab {1,3} c”
Este ejemplo, emparejando propósito es relativamente simple. Partido empieza con una, terminando C, B-1-3 de cadena media de caracteres. NFA máquina automática a su proceso de resolución es el siguiente:
En primer lugar, leer la primera expresión regular y una cadena de caracteres coincide con el primer carácter de una comparación, un par un juego.
Entonces, la lectura de la segunda regulares símbolo de la expresión coincidente b {1,3} b y la segunda cadena de caracteres se compara con un fósforo. Pero debido a que b {1,3} b representa 1-3 cuerda, pero también tiene la NFA autómata características codiciosos, por lo que en este caso no continúa para leer el siguiente carácter regular de la expresión coincidente, pero aún utilizando b {1, 3} se compara b y la tercera cadena de caracteres, el resultado es igualada.
Luego continuar b {1,3} y la cuarta cadena de caracteres se compara c, una falta de coincidencia se encuentra, a continuación, dar marcha atrás ocurre, la cuarta cadena de caracteres que ha sido leído es descargado al carácter c, puntero de nuevo a la posición del tercer personaje b.
Así que después se produce el retroceso, el proceso de correspondencia es cómo continuar? El programa lee la siguiente expresión regular coincidente carácter c, y una cuarta cadena de caracteres C en comparación con los resultados coinciden, el final.

¿Cómo reducir los problemas de espalda?

Dado que el sistema va a traer de vuelta a la sobrecarga de rendimiento, ¿cómo tratar con él? Si usted tiene un vistazo de cerca al caso anterior, se encuentra que la codicia es característico NFA máquina automática de fusibles, y esto regular que coincide con el patrón de expresión de cerca, echar un vistazo.
1. codicioso (y Greedy)
Nombre lo indica, es la cantidad de coincidencias, si se utiliza solo +,?, *, O {min, max} cuantificador etc., que coincidirá con la expresión regular tanto contenido.
Por ejemplo, en la parte superior de los ejemplos:
text = “abbc”
regex = “ab {1,3} c”
Es decir, los codiciosos, el autómata coincidencia máxima NFA rango de lectura, es decir, tres caracteres coincidentes b. Coincide hubo un fallo, que causó un rastreo. Si el resultado del partido es "abbbc", que coincidirá con el éxito.
text = “abbbc”
regex = “ab {1,3} c”
2. Modo de Lazy (reacio)
En este modo, la coincidencia de expresión regular se repite personajes tan poco como sea posible. Si el partido tiene éxito, continuará para que coincida con el resto de la cadena.
Por ejemplo, después de que el personaje en el ejemplo anterior, además de un "?", Usted puede activar el modo vago.
text = “abc”
regex = “ab {1,3}? c”
El resultado de la casación es "abc", NFA autómata primeros selecciona el rango juego más pequeño en este modo, es decir, un caracteres coincidentes b, evitando así problemas de vuelta atrás.
Modo perezoso no está completamente evitar el retroceso, vamos a llegar a entender a través de un ejemplo de la pereza problema de modo de marcha atrás se produce bajo qué circunstancias.
text = “abbc”
regex = “ab {1,3}? c”
Más aún partidos para tener éxito, por lo que? Podemos entender la razón bajo el proceso de adaptación si el modo vago.
En primer lugar, leer la primera expresión regular y una cadena de caracteres coincide con el primer carácter de una comparación, un par un juego. Entonces, la lectura de la segunda regulares símbolo de la expresión coincidente b {1,3} b y la segunda cadena de caracteres se compara con un fósforo.
En segundo lugar, ya que el modo de la pereza inferior, la coincidencia de expresión regular que se repite caracteres como mínimo posible, se ajustan a la siguiente coincidencia de cadenas de caracteres b no continúa para que coincida con la b {1,3}, por lo tanto b eligen dar a los más grandes personajes de los partidos, a su vez coincide con la expresión regular en el siguiente carácter c.
En este punto se encuentra el carácter c coincide con la expresión regular en el carácter c no se corresponde, esto sucederá cuando la parte de atrás del tiempo, esta atrás en el tiempo con el modo codicioso atrás justo lo contrario, el modo vago está dando marcha atrás retroceso expresión regular en un personaje de juego, y luego en un personaje de igualar. Si coincide, la siguiente cadena de caracteres coincidirá con el siguiente carácter y la expresión regular.
3. Exclusivo (Possessive)
Con codiciosos como modo exclusivo maximizará el partido como más contenido, la diferencia es en modo exclusivo, que no se adapte a la final del partido, el retroceso no se produce un problema.
Ejemplos de o encima de, detrás de los caracteres más un signo "+", puede abrir el modo exclusivo.
text = “abbc”
regex = “ab {1,3} + bc”
El resultado es una falta de coincidencia, al final del partido, el retroceso problema no se produce.
Del mismo modo, el modo exclusivo no puede evitar el retroceso se produce, vamos a utilizar este ejemplo tenemos que analizar el principio:
text = “abbc”
regex = “ab {1,3} + c”
El resultado es una coincidencia, porque al igual que el modo de codiciosos, como modo exclusivo maximizará el partido más, después de que haya terminado para que coincida con todos los b, c ir partido, el éxito juego.
Al hablar de esto, usted debe ser muy clara, se utiliza el modo perezoso y modo exclusivo en muchos casos puede reducir la incidencia de vuelta hacia atrás.
Así como el comienzo de ese camino, "¿Por qué un método split () afectará el TPS" de duda, debe ser claro, ¿verdad?
Utilizo el split () método para nombres de dominio extracto y parámetros de la petición para verificar el cumplimiento. split () encuentra un carácter especial cuando los paquetes que coinciden generan una gran cantidad de retroceso, yo estaba en la expresión regular después de la adición de una necesidad para que coincida con el carácter y "+" para resolver este problema.
\\? (([A-Za-z0-9- ~ _ =%] ++ \\ & {0,1}) +)

Optimización de expresiones regulares

Las expresiones regulares trae problemas de rendimiento, me llamaron una llamada de atención, y aquí también queremos compartir con ustedes algunas ideas. Cualquier detalle, es probable que conducen a problemas de rendimiento, si bien refleja el detrás de esto es nuestra comprensión de esta tecnología lo suficientemente completa. Así que animo a aprender la optimización del rendimiento, para dominar la metodología, aprender a mirar más allá de la superficie. Aquí voy a resumir algunas expresiones regulares de métodos de optimización para usted.

1. menos codiciosos, el uso de modo exclusivo

problemas de espalda puede causar codiciosos, que pueden utilizar el modo exclusivo de dar marcha atrás a evitar. Detallé frente también, y aquí no voy a explicar.

2. Reducir la selección rama

Seleccione el tipo de rama "(X | Y | Z)" expresiones regulares pueden degradar el rendimiento, queremos minimizar el uso durante el desarrollo. Si tiene que usar, podemos optimizar las siguientes maneras:
En primer lugar, debemos tener en cuenta el orden de selección, la selección de los artículos más comúnmente utilizados en la parte delantera, por lo que se pueden adaptar con rapidez;
En segundo lugar, podemos tratar de extraer el modo común, por ejemplo, "(ABCD | ABEF)" se sustituye por "ab (cd | ef)", este último juego más rápido, debido a que el NFA oportunidad de forma automática para tratar de igualar ab, si no lo encuentra, no trate de cualquiera de las opciones;
Por último, si es simple para seleccionar el tipo de rama, podemos utilizar tres índice en lugar de "(X | Y | Z)", si la prueba, se encuentran tres veces la eficiencia que el índice "(X | Y | Z)" Alto algunos.

3. Reducir la captura de anidación

Antes de hablar de este método, explico brevemente lo que se captura y el grupo no capturado.
Grupo se refiere a la captura de expresiones regulares, la subexpresión coincide con el contenido almacenado en el número de elemento de matriz digital o nombrado explícitamente, una referencia conveniente después. Por lo general, un () es un conjunto de captura, el grupo de captura puede estar anidada.
No captura de grupo se refiere al grupo no está involucrado en el grupo de captura de partido con números, que se expresó por el general: componentes (exp?).
En las expresiones regulares, cada grupo ha capturado un número, número 0 representa el entero emparejado con el contenido. Podemos ver en el siguiente ejemplo:
pública estática vacío principal ( Cadena [] args)
{
Cadena text = "<entrada de alta = \" 20 \ "peso = \ "70 \"> prueba </ input>" ;
Cadena reg = "(<input *.?>) (</ Input>) (*.?)" ;
Pattern p = Pattern.compile (reg);
Partidos m = p.matcher (texto);
mientras que (m.find ()) {
System.out.println (m.group ( 0 )); // toda contenido coincidente
System.out.println (m.group ( 1 )); // (<input. *?>)
System.out.println (m.group ( 2 )); //(.*?)
System.out.println (m.group ( 3 )); // (</ input>)
}
}
El resultado:
<Entrada de alta = \ "20 \" peso = \ "70 \"> prueba </ input>
<Entrada de alta = \ "20 \" peso = \ "70 \">
prueba
</ Input>
Si no es necesario para obtener el texto en un cierto grupo, a continuación, utilizar el grupo de no-captura. Por ejemplo, el uso "(?: X)" en lugar de "(X)", nos fijamos en el ejemplo siguiente:
pública estática vacío principal ( Cadena [] args)
{
Cadena text = "<entrada de alta = \" 20 \ "peso = \ "70 \"> prueba </ input>" ;
Cadena reg = "(?: <Input *.?>) (*.?) (?: </ Input>)" ;
Pattern p = Pattern.compile (reg);
Partidos m = p.matcher (texto);
mientras que (m.find ()) {
System.out.println (m.group ( 0 )); // toda contenido coincidente
System.out.println (m.group ( 1 )); //(.*?)
}
}
El resultado:
<Entrada de alta = \ "20 \" peso = \ "70 \"> prueba </ input>
prueba
Para resumir: reducir el paquete no es necesario para obtener, se puede mejorar el rendimiento de expresión regular.

resumen

Las expresiones regulares pueden ser pequeñas, pero tiene una poderosa capacidad coincidentes. A menudo utilizamos, por ejemplo, número de teléfono o correo electrónico página de registro de suma de control.
Sin embargo, muy a menudo, nos ignoramos porque es pequeña y reglas de uso, casos de prueba y no cubre el uso de algunos casos especiales, hay muchas situaciones en línea en el movimiento se produce.
Integral de mi experiencia pasada, si utiliza expresiones regulares para hacer que su código simple y conveniente, también lo hacen el rendimiento bajo la premisa de la investigación, es posible usar, y si no es así, entonces la expresión regular puede no hacer, a fin de evitar causar más problemas de rendimiento.

preguntas

Además de método split () para utilizar expresiones regulares, de hecho, Java y algunos modelos también utilizan expresiones regulares para lograr algunas de las características, por lo que podemos caer fácilmente en la trampa. Ahora se piensa en JDK dentro, qué herramientas utilizar el método de expresión regular?
Esperamos poder ver a sus opiniones en la sección de comentarios. Usted es bienvenido a hacer clic en "pedir a un amigo para leer", hoy el compartir contenidos con sus amigos, lo invitó a estudiar juntos.
Publicado 24 artículos originales · ganado elogios 0 · Vistas 415

Supongo que te gusta

Origin blog.csdn.net/WillliveWillWork/article/details/105242420
Recomendado
Clasificación