2009-12-11 96 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