Altova XMLSpy 2024 Enterprise Edition

Site Altova : AltovaWebLink Profileur XSLT, Profileur XQuery

Le profileur XSLT/XQuery est un outil qui est utilisé pour analyser les délais d'exécution des feuilles de style XSLT (1.0 et 2.0) et des documents XQuery depuis XMLSpy. Il vous révèle combien de temps nécessite chaque instruction de feuille de style XSLT ou XQuery document pour l'exécution, et vous pouvez utiliser cette information pour optimiser les délais d'exécution de ces fichiers.

 

Le profileur est utilisé pour trouver les instructions qui présentent le délai d'exécution total le plus élevé afin que cette information puisse être utilisée pour optimiser ces instructions. Les instructions peuvent avoir un délai total d'exécution élevé pour la ou les raisons suivantes :

 

l'instruction exige beaucoup de temps

l'instruction a été évaluée souvent (décompte d'appel élevé)

 

Profilage de décompte des appels et profilage du graphe d'appel

Le profileur vous permet de choisir entre le profilage décompte des appels et graphe d'appels. Les deux types de profilage montrent les statistiques des délais d'exécution pour chaque instruction.

En ce qui concerne les objectifs d'optimisation, normalement, vous utiliserez un profilage de décompte d'appel, qui affiche une ligne dans le profileur pour chaque instruction.

Le profilage d'appel de graphe montre l'histoire complète de l'exécution d'une transformation XSLT ou d'une exécution XQuery, c. à. d. quels modèles/quelles fonctions ont été appelées et dans quel ordre, pendant la transformation. Dans les résultats du profilage du graphe d'appel, vous trouverez une ligne pour chaque moment auquel une instruction est appelée et non pas une ligne pour chaque instruction.

 

Pour utiliser le profileur XSLT/XQuery, voir Profilage XSLT ou Profilage XQuery.

 

Modes Profileur

Plusieurs modes vous permettent de consulter les résultats de l'analyse en cliquant sur l'onglet correspondant :

 

Mode Liste : les statistiques de profilage sont affichées en tant qu'une liste qui peut être triée par exemple, par la durée de l'exécution d'instruction ou la durée de l'exécution de l'instruction et de ses descendants.

profiler_xslt_listonly

Mode Arborescence : les statistiques sont affichées dans une structure arborescente. Il est possible de voir, par exemple combien de temps une fonction a pris à exécuter, puis augmenter l'arborescence pour cette fonction et voir combien de temps chaque instruction contenue dans la fonction a pris pour s'exécuter et combien de fois elle a été exécutée.

profiler_xslt_treeonly

 

Résultats de tri

Une fois que vous avez exécuté le Profileur, vous pouvez trier par la quantité de temps qu'a pris une instruction à exécuter ou par le nombre de fois que cette instruction a été appelée.

 

Pour trier l'information dans le Profileur :

 

1.Cliquer sur l'onglet Liste.
2.Cliquer sur l'en-tête de colonne par laquelle vous souhaitez effectuer votre tri (par ex., Décompte d'appel pour trier par le nombre de fois qu'une instruction a été appelée ou Durée pour trier par le temps qu'a mis l'instruction à s'exécuter).

 

Cette capture d'écran montre les contenus du Profileur trié par la durée d'instruction dans l'ordre descendant.

profiler_xslt_sorted

 

Optimiser vos feuilles de style XSLT et vos documents XQuery

Veuillez garder en tête les lignes directrices suivantes lors de l'optimisation des délais d'exécution des instructions dans les feuilles de style XSLT et les documents XQuery :

 

Éviter d'utiliser des variables dans une instruction si la variable est utilisée une seule fois uniquement, parce que l'initialisation d'une variable peut exiger beaucoup de temps.

 

Les fragments de code XSLT suivants montrent un exemple d'optimisation de code en supprimant des variables superflues. Les deux exemples font la même chose mais le deuxième exemple le fait sans utiliser les variables name et containsResult :

 

Fragment de code 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 capture d'écran ci-dessous montre les résultats de l'analyse du fichier qui contient ce fragment de code, trié par la durée des instructions. L'instruction dans laquelle la variable containsResult est initialisée nécessite au total environ 19 secondes de temps d'exécution.

profiler_optimize_before

La capture d'écran ci-dessous montre les résultats dans le mode arborescence. Ici, vous pouvez constater que la déclaration If qui utilise la variable containsResult nécessite un temps d'exécution d'environ 50 secondes au total :

profiler_optimize_before_tree

La transformation XSLT prend un total d'environ 74 secondes :

profiler_optimize_totaltime1
Fragment de code 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>

 

Une fois que la feuille de style a été réécrite sans utiliser ces variables, son délai d'exécution total est de seulement 4,3 secondes :

 

profiler_optimize_totaltime2

Utiliser des variables si une valeur ou une expression est utilisée de manière répétitive.

Éviter de créer des variables de constante locales dans une fonction ; au lieu de cela, créer des variables globales.

Éviter de créer des fragments d'arborescence constants dans une fonction ; au lieu de cela, les créer globalement.

Limiter votre utilisation des prédicats, puisque le filtrage avec des prédicats est évalué séparément pour chaque nœud. Vous pouvez réduire le nombre d'appels auprès des prédicats, en préfiltrant les noms. Dans cet exemple, * est utilisé avec deux prédicats :

 

//*[node-name()=Book][author="Steve"]

 

Dans cette instruction équivalente, le nom Book et un seul prédicat sont utilisés :

 

//Book[@Author="Steve"]

 

Partager les instructions de manière à ce que des parties de l'instruction qui doivent uniquement être exécutées une fois sont uniquement utilisées une fois. Créer des variables globales à partir des parties qui sont uniquement dépendantes du contexte global.

 

© 2017-2023 Altova GmbH