2011-07-21 4 views
0

J'ai une application en temps réel qui utilise XSLT1 et je veux passer à XSLT2. Actuellement, j'utilise le moteur Microsoft xslt1 qui fonctionne pour un xml spécifique et xsl dans les 0,1 seconde.XQSharp XSLT2 optimisation des performances

Pour la transformation XSLT2, j'ai créé une fonction qui utilise XQSharp pour effectuer une transformation xslt2. J'ai utilisé le même xml et xsl et la transformation a pris 0,9 seconde.

J'ai analysé mon code et il se révèle que plus de 90% du temps de traitement est causée par cette ligne:

Dim requête Comme Xslt = Xslt.Compile (New StringReader (inputXsl), querySettings)

Ma question est de savoir s'il existe un moyen d'accélérer ce processus?

Par exemple en changeant certains querySettings?

Mon code complet

<WebMethod()> _ 
    Public Function XSLTXQSharp(ByVal inputXml As String, ByVal inputXsl As String) As String 
     Dim nameTable As XmlNameTable = New NameTable() 

     Dim xmlReaderSettings As New XmlReaderSettings() 
     xmlReaderSettings.NameTable = nameTable 

     Dim document As XdmDocument 

     Using reader As New StringReader(inputXml) 
      Using xmlReader As XmlReader = xmlReader.Create(reader, xmlReaderSettings) 
       document = New XdmDocument(xmlReader) 
      End Using 
     End Using 


     Dim querySettings As New XsltSettings(nameTable) 
     querySettings.ContextItemType = XdmType.Node 
     querySettings.ModuleResolver = New XmlUrlResolver() 


     ''' SLOW!!! more then 90 % of execution time 
     Dim query As Xslt = Xslt.Compile(New StringReader(inputXsl), querySettings) 

     Dim contextItem As XPathNavigator = document.CreateNavigator() 
     Dim result As Stream = New MemoryStream() 
     query.ApplyTemplates(contextItem, result) 

     'Return dt2.Subtract(dt1).ToString() 

     result.Position = 0 
     Using reader As StreamReader = New StreamReader(result) 
      Return reader.ReadToEnd() 
     End Using 


    End Function 

Répondre

0

Vous pouvez vous trouver besoin d'utiliser un forum spécifique pour XQSharp pour celui-ci.

Est-ce un cas où une feuille de style volumineuse et complexe est utilisée pour transformer un petit document source?

Est-il impossible d'amortir le coût de compilation de la feuille de style et de mettre en cache le résultat à utiliser pour de nombreuses transformations? Très souvent, les développeurs supposent que le temps passé à optimiser le code lors de la compilation est bien dépensé s'il réduit le temps d'exécution, ce qui ne semble pas être le cas de la façon dont cette charge de travail est écrite. D'un point de vue purement égoïste, je serais très intéressé de savoir comment les chiffres se comparent à ceux de Saxon.

+0

C'est drôle parce que je suis également intéressé par la comparaison avec Saxon, mais pour ce faire, je dois d'abord résoudre certains problèmes que j'ai avec la compilation de la même feuille de style dans Saxon. Voir [cette question] (http://stackoverflow.com/questions/6772630/getting-detailed-error-description-from-saxon-9-x-in-net) à propos de saxon que j'ai. – MLewi

+0

Saxon fait la transformation en 0,45 s. – MLewi

+0

Y a-t-il aussi des paramètres dans saxon qui peuvent avoir une influence sur les performances? – MLewi

1

Essayez de modifier le niveau d'optimisation. C'est une propriété sur les paramètres de contexte statiques. Il serait utile de voir la transformation que vous essayez de compiler.

Notez que le compilateur Microsoft est assez rapide et il compile en code octet. XQSharp a tendance à gagner avec des feuilles de style plus complexes ou lorsque les fonctionnalités XSLT 2.0 (par exemple pour chaque groupe) remplacent l'utilisation des clés dans XSLT 1.0.

+0

Définition de querySettings.OptimizationLevel = OptimizationLevel.Local/None a donné le meilleur résultat d'avarage 0,6 seconde. – MLewi

Questions connexes