2011-07-21 46 views
0

我有一個使用XSLT1的實時應用程序,我想升級到XSLT2。 目前我正在使用microsoft xslt1引擎,它在0.1秒內執行特定的xml和xsl。XQSharp XSLT2性能調整

對於XSLT2轉換,我創建了一個使用XQSharp執行xslt2轉換的函數。我使用了相同的xml和xsl,轉換花費了0.9秒。

我分析我的代碼,並將其結果是處理時間更然後90%是由該線引起的:

昏暗查詢作爲XSLT = Xslt.Compile(新StringReader(inputXsl),querySettings)

我的問題是有一種方法來加快這個過程?

例如通過改變一些querySettings?

我完整的代碼

<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 

回答

0

你會發現你需要使用特定XQSharp對於這一個論壇。

這是一個大型複雜樣式表用於轉換小型源文檔的情況嗎?

有沒有辦法可以分攤編譯樣式表的成本,然後緩存結果以用於許多轉換?很多時候,開發人員會認爲在編譯過程中優化代碼所花費的時間很多,如果它減少了運行時執行時間 - 這似乎並不是真正的寫這個工作負載的方式。

從純粹自私的角度來看,我很想知道這些數字與撒克遜人相比如何。

+0

這很有趣,因爲我也對Saxon比較感興趣,但是爲了做到這一點,我首先必須解決一些與編譯Saxon樣式表相關的問題。看到[這個問題](http://stackoverflow.com/questions/6772630/getting-detailed-error-description-from-saxon-9-x-in-net)關於撒克遜我有。 – MLewi

+0

撒克遜正在進行0,45秒的轉換。 – MLewi

+0

撒克遜還有一些設置可以影響性能嗎? – MLewi

1

嘗試更改優化級別。它是靜態上下文設置的屬性。看到您正在編譯的轉換會很有幫助。

請注意,Microsoft編譯器非常快,它編譯爲字節碼。 XQSharp傾向於贏得更復雜的樣式表,或者XSLT 2.0功能(例如for-each-group)在XSLT 1.0中取代鍵的使用。

+0

設置querySettings.OptimizationLevel = OptimizationLevel.Local/None給出了avarage 0.6秒的最佳結果。 – MLewi