Performance: call-template vs appliquer-modèle
en XSLT, est-il une différence de performance entre les appliquer-modèle et modèle? Dans mes feuilles de style, il ya de nombreux cas où je peux utiliser, ce qui est le meilleur choix?
- fournir un exemple donc, au moins à titre de comparaison peut être faite
Vous devez vous connecter pour publier un commentaire.
Comme avec tous questions de performances, la réponse dépendra de votre configuration particulière (en particulier le processeur XSLT que vous utilisez) et le type de traitement que vous êtes en train de faire.
<xsl:apply-templates>
prend une séquence de nœuds et passe à travers eux un par un. Pour chacun, il localise le modèle avec la priorité la plus élevée qui correspond au nœud, et l'appelle. Donc<xsl:apply-templates>
est comme un<xsl:for-each>
avec un<xsl:choose>
à l'intérieur, mais plus modulaire.En revanche,
<xsl:call-template>
appelle un modèle par son nom. Il n'y a pas de changement pour le nœud de contexte (pas de<xsl:for-each>
) et pas le choix sur le modèle à utiliser.Donc, avec exactement les mêmes circonstances, vous pourriez imaginer que
<xsl:call-template>
sera plus rapide car il fait moins de travail. Mais si vous êtes dans une situation où soit<xsl:apply-templates>
ou<xsl:call-template>
pourrait être utilisé, vous allez probablement être en train de faire la<xsl:for-each>
et<xsl:choose>
vous-même, en XSLT, plutôt que le processeur fait pour vous, en coulisses. Donc au final je pense qu'il sera probablement l'équilibre. Mais comme je l'ai dit ça dépend beaucoup de la nature de l'optimisation de votre processeur a mis en place et exactement ce que le traitement que vous faites. Mesurer et voir.Mes règles du pouce sur l'utilisation de l'appariement de modèles et d'utilisation de modèles nommés sont:
<xsl:apply-templates>
et d'appariement de modèles si vous êtes le traitement des nœuds individuels pour obtenir un résultat; utiliser des modes si un nœud particulier doit être traitée de plusieurs façons différentes (comme dans la table des matières vs le corps d'un document)<xsl:call-template>
et un modèle nommé si vous êtes à la transformation d'autre chose que d'un nœud particulier, tels que des chaînes ou des nombres ou des ensembles de nœuds<xsl:function>
si vous êtes de retour d'une valeur atomique ou un nœud existantappliquer-modèle et la call-template ne pas effectuer la même tâche, comparaison des performances n'est pas vraiment pertinent ici.
appelez-modèle est un modèle de nom de paramètre alors que s'applique le modèle prend une expression xpath. Appliquez-le modèle est donc beaucoup plus puissant car vous ne savez pas vraiment quel modèle sera exécuté.
Vous obtiendrez des problèmes de performances si vous utilisez complexe des expressions xpath. Éviter les "//" dans les expressions xpath puisque chaque nœud de votre document d'entrée seront évalués.
//
est non seulement lente, mais aussi sent bad.Elle dépend de l'analyseur xml que vous utilisez. Je ne peux pas parler pour rien mais .NET 2003 analyseur où j'ai fait quelques informel tests de performance sur push vs tirez code XSLT. Ceci est similaire à ce que vous demandez: apply-template = push et la call-template = la traction. J'ai été convaincu push serait plus rapide, mais ce n'était pas le cas. Il était sur le même.
Désolé je n'ai pas le test exact maintenant. Je vous recommande de l'essayer avec votre analyseur de choix et de voir si il n'y a aucune différence majeure. Mon pari est-il gagné pas l'être.