如何对XSLT进行性能分析和优化?

31

我有一个XSLT用于在浏览器中查看XML文件。该XSLT编写得很 naive,目前执行时间很长(几分钟)。

我的XML文件大小适中(〜1 MiB),对于相同文档的其他执行不同处理的XSLT执行速度更快。因此我知道问题不在于XML的大小,而是在于我的XSLT。

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

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


如果您提供XSLT代码和出现问题的XML文档,我和其他人可以尝试帮助。 - Dimitre Novatchev
注意:XSLT分析和(更好的)调试已经添加到Visual Studio 2010中。当然,这仍然是XSLT 1.0。 - Abel
5个回答

34
你使用的是哪个XSLT引擎?如果你使用的是.NET引擎和Visual Studio,你可以使用集成在Visual Studio中的XSLT分析器,它非常有用。
其他优秀的分析工具包括Altova的XML SpyOxygen
如果您能发布您的XSLT,就更容易告诉您可能存在瓶颈的位置。一般来说,要小心XPath表达式,如'//'、preceding::*和following::*。以下是一些规则和最佳实践:
避免重复使用"//item"。 不要对同一个节点集计算多次。将其保存在变量中。 如果可以的话,避免使用。例如,使用position()。 使用,例如解决分组问题。 避免在模板规则中使用复杂的模式。相反,请使用 within the rule。 在使用preceding[-sibling]或following[-sibling]轴时要小心。这经常 表示一个具有n平方性能的算法。 不要对同一个节点集进行多次排序。如果必要,将其保存为结果树碎片,并使用node-set()扩展 函数访问它。 为了输出简单的#PCDATA元素的文本值,请使用 而不是。 (来自http://www.dpawson.co.uk/xsl/sect4/N9883.html#d15756e150) 遵循这些规则通常会导致非常高效的XSLT,您可能根本不需要使用分析器。

关于您在浏览器中使用XSLT的问题:我不建议这样做,因为首先您不是平台无关的(不是每个浏览器都可能支持它,或者某些浏览器可能仅支持性能较差的引擎),其次您不能控制所使用的引擎。


我在浏览器中运行,所以我的XSLT引擎是Firefox、IE和Safari使用的任何引擎。我知道每个引擎在处理相同的XSLT时会有不同的行为,因此对一个特定的引擎进行分析可能不能反映所有三个引擎的情况。 - pauldoo
请发布有问题的XSLT代码,我可以帮助您找到有问题的行。 - Dirk Vollmar
1
我已经使用了xsl:key,这使得程序性能有了巨大的提升。现在在小样本上运行速度快了10倍,在大样本上的差距更大。在尝试其他优化之前,我会先实现其余的功能。 - pauldoo
2
微软有一个独立的分析器,名为“XsltMajic Profiler Tool”。在这篇文章中有它的下载链接:http://support.microsoft.com/kb/331026/。 - Ricardo Nolde
Visual Studio的链接似乎已经移动到http://www.microsoft.com/en-us/download/details.aspx?id=10986。 - FrustratedWithFormsDesigner
显示剩余2条评论

24
如果您提供XSLT代码和观察问题的XML文档,我和其他人可以尝试帮忙。
这里是Michael Kay提供的一些XSLT使用和性能技巧
如何高效使用XSLT的八个技巧:
1. 保持源文件较小。必要时先分割文档。 2. 在运行之间将XSLT处理器(和Java VM)保留在内存中。 3. 如果您重复使用同一样式表,请先编译它。 4. 如果您重复使用同一源文档,请将其保留在内存中。 5. 如果您重复执行相同的转换,请不要这样做。取而代之,存储结果。 6. 保持输出文档较小。例如,如果生成HTML,请使用CSS。 7. 不要对同一源文档进行多次验证。 8. 将复杂的转换拆分为几个阶段。
如何编写高效的XSLT的八个技巧:
  1. 避免重复使用"//item"。
  2. 不要多次评估相同的节点集;将其保存在变量中。
  3. 如果可以,避免使用<xsl:number>。例如,通过使用position()
  4. 使用<xsl:key>,例如解决分组问题。
  5. 避免在模板规则中使用复杂的模式。而是在规则内部使用<xsl:choose>
  6. 在使用preceding[-sibling]following[-sibling]轴时要小心。这通常表示具有n平方性能的算法。
  7. 不要对相同的节点集进行多次排序。如果必要,将其保存为结果树片段并使用node-set()扩展函数访问它。
  8. 要输出简单#PCDATA元素的文本值,请优先使用<xsl:value-of>而不是<xsl:apply-templates>

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

1

0
我会建议使用“键”进行连接/查找,这是最佳实践。
我刚刚通过使用“键”(y的id作为键),而不是/x//y[id=$id],将查找时间从400秒降低到了13秒。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接