Generador de perfiles XSLT y XQuery
Sitio web de Altova: Generador de perfiles XSLT, Generador de perfiles XQuery
El generador de perfiles XSLT/XQuery es una herramienta que sirve para analizar los tiempos de ejecución de las hojas de estilos XSLT (1.0 o 2.0) y de documentos XQuery desde XMLSpy. El generador informa del tiempo que tarda cada instrucción de la hoja de estilos XSLT o del documento XQuery en ejecutarse. Esta información puede ser muy útil a la hora de optimizar el tiempo de ejecución de estos archivos.
El generador de perfiles se utiliza para buscar las instrucciones que presentan el mayor tiempo de ejecución total y poder optimizarlas. Si una instrucción tiene un tiempo de ejecución alto es porque:
•la instrucción requiere demasiado tiempo
•la instrucción se evalúa demasiado a menudo (tiene un recuento alto)
•ambas razones
Generación de perfiles con contador y con gráfico de llamadas
El generador de perfiles puede generar perfiles con contador o con gráfico de llamadas. Ambos tipos de generación de perfiles muestran estadísticas sobre el tiempo de ejecución de cada instrucción.
Si desea optimizar una instrucción, lo normal es usar la generación de perfiles con contador, que muestra una línea en la ventana del generador de perfiles por cada instrucción.
La generación de perfiles con gráfico de llamadas muestra el historial de ejecución completo de una transformación XSLT o una ejecución de XQuery. Es decir, muestra a qué plantillas o funciones se llamó y en qué orden se les llamó durante la transformación. En los resultados de la generación de perfiles con gráfico de llamadas se muestra una línea por cada vez que se llamó a una instrucción, en lugar de una línea por cada instrucción.
Para usar el generador de perfiles XSLT/XQuery, consulte los apartados Generación de perfiles XSLT y Generación de perfiles XQuery.
Vistas del generador de perfiles
Los resultados del análisis se pueden ver en dos vistas diferentes, dependiendo de la pestaña seleccionada en la ventana de resultados:
•Vista en forma de lista: las estadísticas de la generación de perfiles se presentan en forma de lista. La lista se puede ordenar en base a varios criterios (p. ej. en base a la duración de la ejecución de la instrucción o de la ejecución de la instrucción y sus descendientes).
•Vista en forma de árbol: las estadísticas se presentan en una estructura en forma de árbol en la que por ejemplo puede ver cuánto tardó en ejecutarse una función y expandir el árbol de la función para ver cuánto tardó en ejecutarse cada instrucción de la función y cuántas veces se ejecutó.
Ordenar los resultados
Después de ejecutar el generador de perfiles puede ordenar los resultados en base a varios criterios, como el tiempo que tardó en ejecutarse una función o cuántas veces se llamó a una instrucción.
Para ordenar la información del generador de perfiles:
1.Haga clic en la pestaña Lista.
2.Haga clic en el encabezado de la columna que desea ordenar (p. ej. haga clic en Recuento para ordenar los resultados en base al número de veces que se llamó a las instrucciones o en Duración para ordenar los resultados en base al tiempo que tarda en ejecutarse cada instrucción).
En esta captura de pantalla del generador de perfiles los resultados se ordenaron en base a la duración de la instrucción y en orden descendente.
Optimizar sus hojas de estilos y documentos XQuery
Cuando optimice el tiempo de ejecución de las instrucciones de sus documentos XQuery y XSLT tenga en cuenta estos aspectos:
•La inicialización de variables requiere demasiado tiempo. Por tanto, evite usar variables en una instrucción si la variable se utiliza una sola vez.
Los fragmentos de código XSLT que aparecen a continuación son un ejemplo de cómo puede optimizar el código si quita variables innecesarias. Ambos códigos hacen lo mismo, pero el segundo lo hace sin usar las variables name ni containsResult: |
Fragmento de código nº 1: |
<xsl:for-each select="row">
<xsl:variable name="row" select="."/>
<xsl:for-each select="@name">
<xsl:variable name="name" select="."/>
<xsl:variable name="containsResult" select="fn:contains($name, '.exe')"/>
<xsl:if test="string($containsResult)='true'">
...
</xsl:if>
</xsl:for-each>
</xsl:for-each>
La imagen que aparece a continuación muestra los resultados que se obtienen al analizar el archivo que contiene este fragmento de código, ordenados en base a la duración de las instrucciones. La instrucción en la que se inicializa la variable containsResult tarda en total 19 segundos en ejecutarse.
Esta otra imagen muestra los resultados en la vista Árbol. Aquí podemos ver que la instrucción If que utiliza la variable containsResult tarda en total 50 segundos en ejecutarse:
En total la transformación XSLT tarde unos 74 segundos:
Fragmento de código nº 2: |
<xsl:for-each select="row"> |
<xsl:variable name="row" select="."/> |
<xsl:for-each select="@name"> |
<xsl:if test="fn:contains(., '.exe')"> |
... |
</xsl:if> |
</xsl:for-each> |
</xsl:for-each> |
Después de volver a escribir la hoja de estilos y eliminar las variables, el tiempo total de ejecución es unos 4,3 segundos:
•Es recomendable usar variables si un valor o expresión se usa repetidas veces.
•Intente no crear variables constantes locales dentro de una función. Es preferible crear variables globales.
•Intente no crear fragmentos de árbol de constantes dentro de una función. Es preferible crearlos globalmente.
•El filtrado con predicados se evalúa por separado por cada nodo. Por tanto, es recomendable reducir el uso de predicados. Puede reducir el número de llamadas a predicados si realiza filtros previos con nombres. En este ejemplo, * se usa con dos predicados:
//*[node-name()=Book][author="Steve"]
En esta otra instrucción equivalente a la anterior, se usan el nombre Book y un solo predicado: |
//Book[@Author="Steve"] |
•Es recomendable dividir las instrucciones de modo que la parte de la instrucción que se debe ejecutar una sola vez se ejecute una sola vez. También es preferible crear variables globales a partir de las partes que dependen sólo del contexto global.