【发布时间】:2009-12-11 09:16:18
【问题描述】:
XML 与 XSLT 或 CLR 与 DataBinding 哪个更快? 我假设它是 CLR + 数据绑定,但我可能是错的。
【问题讨论】:
-
感谢您提出问题...只是因为我喜欢比较两者...大多数其他人可能会说它因个别情况而异...
-
因人而异...
标签: xml data-binding xml-serialization xslt
XML 与 XSLT 或 CLR 与 DataBinding 哪个更快? 我假设它是 CLR + 数据绑定,但我可能是错的。
【问题讨论】:
标签: xml data-binding xml-serialization xslt
这实际上是一个非常贴近我自己内心的问题,因为我所做的几乎所有工作都围绕 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:script 标记的编译方式与 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 转换上。特别是在具有大量 RAM 可用于内存转换的系统上。我已经看到 XSLT 转换扩展到相当惊人的水平,一旦掌握了一些非常关键的点,它就真的不难维护了。
看看我是否还记得其他人,如果我记得,我会编辑这篇文章...
【讨论】:
您应该对您的特定用例进行基准测试,而不是试图根据错误的概括来获得(可能是错误的)答案。
【讨论】: