2009-12-11 57 views
2

哪個更快,帶有XSLT或帶DataBinding的CLR的XML? 我假設它是CLR + Databinding,但我可能是錯的。哪個更快,XML + XSL或CLR + DataBinding

+0

謝謝你問這個問題的人......只因爲我喜歡比較兩個......大多數人可能會說它根據個人情況而有所不同... – LorenVS 2009-12-11 09:56:19

+1

它根據個人情況而有所不同... – 2009-12-13 21:04:40

回答

4

這實際上是非常接近我自己的心臟問題,因爲幾乎所有我做的工作都是圍繞着XSLT設計層,基於自定義.NET後端產生的數據(我愛系統死亡)。

據我所知,有一些應該牢記的幾件事情:

  • 務必確保您使用System.Xml.Xsl.XslCompiledTransform的高速緩存的實例。這個類使用System.Reflection.Emit按需創建類,絕對泵出你的XSLT轉換快得令人難以置信

    • 使用正確的數據結構作爲輸入到您的XSLT轉換。如果您有XmlDocument(或更好的XPathDocument)可用,請使用它。否則,對於非常大的輸入文檔和轉換傳入xml讀取器(如果可用),因爲XslCompiledTransform會將文檔加載到XPathDocument(爲XPath訪問進行了優化)。僅需添加,System.Xml.XPath中存在一個System.Xml.Linq.XElement類型的擴展方法,它將從XElement創建一個XPathNavigator,如果您的源數據結構是XElement,它將派上用場。

    • 請勿在xsl轉換中使用msxsl:script標籤。 msxsl:腳本標記的編譯方式與xslt的其餘部分不同,並且會在高需求的應用程序中導致嚴重的內存泄漏(它們每次運行xslt都會加載自定義程序集)

    • 避免使用擴展方法可能。我反編譯(反射器FTW)到.NET源代碼,用於在XSLT轉換中執行擴展方法,而其核心實際上只不過是對MethodInfo.Invoke()的調用。一些調用不會破壞你的應用程序,但不要認爲你可以彌補所有XSLT使用擴展方法的缺點(可能在未來版本的框架中改變,因爲它們在自定義哈希系統中緩存擴展方法,很有可能他們可以將它翻譯成使用編譯後的linq表達式,在這種情況下,它會閃電般快)

    • 據我所知,System.Web.UI.DataBinder仍然歸結爲一個調用System.ComponentModel.ReflectPropertyDescriptor使用System.Reflection.MethodInfo.Invoke()爲了評估Eval(「MyProperty」)語句。這將是兩個模型之間在性能方面最大的比較之一。通過最小化反射調用的次數,XSLT在這裏佔上風。

    • 這是非常非常容易寫非調諧XSLT文件。正確使用xsl變量可以真正消除產生xml輸出所需的許多迭代。如果你有一個通常被引用的輸入元素,把它存儲在一個xsl變量中,然後從那裏訪問它。

    • 根據您是否計劃直接寫你的XSL輸出響應流。請記得正確調整緩衝區大小。通過在你的轉換MemoryStream中設置一個默認的緩衝區大小,你可以爲你自己節省大量的內存分配(在xsl轉換的上下文中通常很大)。

    • 儘管這真的歸結爲應用程序級別的問題。在使用XSLT轉換時,避免了控件創建,視圖狀態序列化,事件持久化等等等等的全部開銷......創建一個更簡單的頁面生命週期(獲取數據,轉換,並帶有幾個細微之處)與應該給另一個優勢在於基於XSLT的系統。

總體來說,我的錢肯定是在正確執行XSLT轉換一個很好的結構。特別是在有大量內存可用於內存轉換的系統上。我已經看到XSLT轉型的規模達到了一個相當令人難以置信的水平,而且一旦學習了一些非常重要的關鍵點,實際上就不難保持。

會看看我能記住任何人,如果我這樣做會編輯這個職位......

+0

這個問題的含義很模糊,很難知道這個答案有多少與它真正相關,但即使如此,這也是很好的信息。 – 2009-12-11 20:09:08

3

您應該基準您的具體使用情況,而不是試圖讓基於錯誤的概括(可能是錯誤的)答案。

+0

+1,但我敢打賭XSLT馬 – 2009-12-11 09:38:03