【问题标题】:Which is faster, XML + XSL or CLR + DataBinding哪个更快,XML + XSL 或 CLR + DataBinding
【发布时间】:2009-12-11 09:16:18
【问题描述】:

XML 与 XSLT 或 CLR 与 DataBinding 哪个更快? 我假设它是 CLR + 数据绑定,但我可能是错的。

【问题讨论】:

  • 感谢您提出问题...只是因为我喜欢比较两者...大多数其他人可能会说它因个别情况而异...
  • 因人而异...

标签: xml data-binding xml-serialization xslt


【解决方案1】:

这实际上是一个非常贴近我自己内心的问题,因为我所做的几乎所有工作都围绕 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 转换扩展到相当惊人的水平,一旦掌握了一些非常关键的点,它就真的不难维护了。

看看我是否还记得其他人,如果我记得,我会编辑这篇文章...

【讨论】:

  • 这个问题很模糊,很难知道这个答案有多少与它真正相关,但即便如此,它也是很好的信息。
【解决方案2】:

您应该对您的特定用例进行基准测试,而不是试图根据错误的概括来获得(可能是错误的)答案。

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2011-12-10
    • 2011-12-08
    • 1970-01-01
    • 2010-11-10
    • 2012-10-03
    • 2011-02-15
    • 2012-07-21
    • 1970-01-01
    相关资源
    最近更新 更多