Altova XMLSpy 2024 Enterprise Edition 

Sitio web de Altova: AltovaWebLink 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).

profiler_xslt_listonly

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ó.

profiler_xslt_treeonly

 

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.

profiler_xslt_sorted

 

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.

profiler_optimize_before

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:

profiler_optimize_before_tree

En total la transformación XSLT tarde unos 74 segundos:

profiler_optimize_totaltime1
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:

 

profiler_optimize_totaltime2

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.

 

© 2018-2024 Altova GmbH