【问题标题】:How do I profile and optimize an XSLT?如何分析和优化 XSLT?
【发布时间】:2010-09-30 21:39:45
【问题描述】:

我有一个用于在浏览器中查看 XML 文件的 XSLT。 XSLT 的编写很简单,目前需要很长时间才能执行(几分钟)。

我的 XML 文件大小适中 (~1 MiB),针对同一文档执行不同处理的其他 XSLT 执行速度要快得多。所以我知道问题不是 XML 的大小,而是我的 XSLT。

如何对我的 XSLT 进行分析和优化?

(在浏览器中执行复杂的 XSLT 是不是一个坏主意?我应该改为应用 XSLT 应用程序端吗?)

【问题讨论】:

  • 如果您提供 XSLT 代码和您发现问题所在的 XML 文档,我和其他人可以尝试提供帮助。
  • 注意:XSLT 分析和(更好的)调试已添加到 Visual Studio 2010。当然,这仍然是 XSLT 1.0。

标签: optimization xslt profiling


【解决方案1】:

您使用的是哪个 XSLT 引擎?如果您使用的是 .NET 引擎和 Visual Studio,您可以使用集成到 Visual Studio 中的 XSLT profiler,这非常有用。

其他优秀的分析工具是 Altova 的 XML SpyOxygen

如果您发布您的 XSLT,那么告诉您可能的瓶颈在哪里会更容易。通常要小心 XPath 表达式,例如 '//'、previous::* 和 following::*。更多规则和最佳实践:

  1. 避免重复使用"//item"
  2. 不要多次评估同一个节点集;将其保存在变量中。
  3. 如果可以,请避免使用<xsl:number>。例如,通过使用 position()。
  4. 使用<xsl:key>,例如解决分组问题。
  5. 避免模板规则中的复杂模式。相反,使用 在规则范围内。
  6. 使用preceding[-sibling]following[-sibling] 轴。这往往 表示具有 n 平方的算法 性能。
  7. 不要对同一个节点集进行多次排序。如有必要,请保存 结果树片段和访问 它使用node-set() 扩展 功能。
  8. 要输出简单#PCDATA 元素的文本值,请使用 <xsl:value-of> 优先于 <xsl:apply-templates>

(来自http://www.dpawson.co.uk/xsl/sect4/N9883.html#d15756e150

遵循这些规则通常会产生非常高效的 XSLT,您可能根本不需要使用分析器。

关于您在浏览器中关于 XSLT 的问题:我不推荐它,因为首先您不是独立于平台的(不是每个浏览器都可能支持它,或者某些浏览器可能只支持性能不佳的引擎),其次您可以' t 控制使用的引擎。

【讨论】:

  • 我在浏览器中运行,所以我的 XSLT 引擎是 Firefox、IE 和 Safari 使用的。我知道每个引擎使用相同的 XSLT 会有不同的行为,因此分析一个特定的引擎可能不会反映所有 3。
  • 发布有问题的 XSLT,我可以帮助您找到有问题的行。
  • 正如 divo 所说:“发布有问题的 XSLT,我可能会帮助您找到有问题的行”:)
  • 我使用了 xsl:key,这产生了巨大的影响。现在小样本的速度提高了 10 倍,大样本的差异更大。在我尝试其他一些优化之前,我会先实现我的其余功能。
  • 微软有一个独立的分析器。它被称为“XsltMajic Profiler Tool”。在这个 KB 中有一个链接:support.microsoft.com/kb/331026
【解决方案2】:

如果您提供 XSLT 代码和您发现问题所在的 XML 文档,我和其他人可以尝试提供帮助

这里有一些来自Michael KayXSLT usage and performance tips

如何高效使用 XSLT 的八个技巧

  1. 保持源文档小。如有必要,请先拆分文档。
  2. 在两次运行之间保持 XSLT 处理器(和 Java VM)加载到内存中
  3. 如果重复使用同一个样式表,请先编译。
  4. 如果您重复使用同一个源文档,请将其保存在内存中。
  5. 如果您重复执行相同的转换,请不要。而是存储结果。
  6. 保持输出文档较小。例如,如果您要生成 HTML,请使用 CSS。
  7. 切勿多次验证同一个源文档。
  8. 将复杂的转换分成几个阶段。

如何编写高效 X 的八个技巧SLT:

  1. 避免重复使用“//item”。
  2. 不要多次评估同一个节点集;将其保存在变量中。
  3. 如果可以,请避免使用<xsl:number>。例如,使用position()
  4. 使用<xsl:key>,例如解决分组问题。
  5. 避免模板规则中的复杂模式。相反,请在规则中使用 <xsl:choose>
  6. 使用preceding[-sibling]following[-sibling] 时要小心 轴。这往往 表示具有n-squared 性能的算法。
  7. 不要对同一个节点集进行多次排序。如有必要,将其另存为 结果树片段 并使用node-set() 扩展功能访问它。
  8. 要输出简单#PCDATA 元素的文本值,请使用<xsl:value-of> 优先 到<xsl:apply-templates>

【讨论】:

    【解决方案3】:

    商业的Oxygen XML 编辑器具有分析和调试XSLT 文件的功能。它也是一个很好的 XML 编辑器。

    【讨论】:

      【解决方案4】:

      我喜欢在基于 Windows 的机器上使用 Altova's XMLSpy。它还内置了一个分析器。你可以check out a video on using the editor。 (扫描至 5:45 以了解有关探查器的更多信息)。它是一种商业产品……有时间试用期:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-13
        • 2011-08-15
        • 1970-01-01
        • 2012-01-16
        • 1970-01-01
        • 1970-01-01
        • 2016-08-01
        相关资源
        最近更新 更多