基准测试XSLT性能

3
我正在尝试对两个XSLT版本进行基准测试。目前,我使用Visual Studio进行调试,因为XML转换是从.NET组件中调用的。 VS 2010是我用于开发的IDE。
唯一的线索来自输出窗口(以下是一个示例):
样式表加载时间:656.2毫秒 样式表JIT时间:11.18毫秒 样式表执行时间:177.8毫秒
我认为我只需要关注"样式表执行时间",但不确定这些值是否反映了XSL的实际能力,因为它似乎每次运行都在不断变化。
我想知道是否有可靠的方法来对XSL进行基准测试。任何有关在.NET运行时中对XSL进行基准测试的实践经验分享将会有所帮助。

保持准确性的最佳方法是确保使用编译选项编译XSLT。如果不这样做,每次执行的时间都会与第一次不同。 - dmportella
你可以使用XslCompiledTransform来实现这个功能。 - dmportella
3个回答

3
这个问题之前在stackoverflow上已经被问过,你可以在这里查看原始问题:如何对XSLT进行分析和优化? 下面是被接受的答案中的一部分代码片段:
你使用的是哪个XSLT引擎?如果你正在使用.NET引擎和Visual Studio,你可以使用Visual Studio集成的XSLT性能分析器,这非常有用。其他优秀的分析工具包括Altova的XML Spy和Oxygen。如果你发布你的XSLT,那么更容易告诉你可能存在瓶颈的地方。通常要注意XPath表达式,如'//'、preceding::*和following::*。一些更多的规则和最佳实践: 1.避免重复使用“//item”。 2.不要对同一节点集进行多次评估;将其保存在一个变量中。 3.尽可能避免使用。例如,通过使用position()。 4.使用,例如解决分组问题。 5.避免在模板规则中使用复杂的模式。相反,使用within the rule。 6.在使用preceding[-sibling]或following[-sibling]轴时要小心。这经常表示具有n平方性能的算法。 7.不要对同一节点集进行多次排序。如果必要,将其保存为结果树片段,并使用node-set()扩展函数访问它。 8.为了输出简单的#PCDATA元素的文本值,首选使用而不是。(来自[http://www.dpawson.co.uk/xsl/sect4/N9883.html#d15756e150][4])。最初来自:https://stackoverflow.com/users/40347/0xa3
我会确保在运行之前编译你调用的XSLT,这样你就不会从每次编译过程中获取混合指标。您可以使用 XslCompiledTransform 类来确保在运行之前编译XSLT。非常重要的是,您不要将其释放并重复使用转换,否则每次重新创建对象时它都会重新编译,并花费随机的时间。这里有一篇有趣的文章:http://www.windowsdevcenter.com/pub/a/dotnet/2003/07/14/xsltperf.html,名为.NET中的XSLT性能。它继续对比了.Net中的XSLT转换和其他xslt引擎。我的经验是,除非向转换添加自定义函数(例如调用不太高效的自定义代码),否则与大多数小到中型样式表相比,XSLT的性能非常快,尤其是如果您没有许多导入和函数调用。如果您真的担心,MSDN企业模式和实践中有一篇关于XML和XSLT转换性能的精彩文章。
这里有一篇文章:http://msdn.microsoft.com/en-us/library/ff649152.aspx 我谈论的部分在这里:http://msdn.microsoft.com/en-us/library/ff647804.aspx 微软发表了一篇关于基准测试XSLT的文章,非常有趣。http://blogs.msdn.com/b/antosha/archive/2006/07/24/xslcompiledtransform-performance-beating-msxml-4-0.aspx 还有一种方法可以将样式表预编译成代码,这样XSLT变换只需加载而不需要解析。
你可以在这里找到相关信息:(在.NET中使用预编译的XSLT)http://my-tech-talk.blogspot.co.uk/2009/03/using-precompiled-xslt-in-net.html

谢谢。我正在查看它。顺便说一下,我目前正在使用XslCompiledTransform但结果不尽相同。 - thinkster
1
你能确认输入是否总是相同的,以及是否保留了 XslCompiledTransform 的静态版本吗?如果你在创建完对象后就处理掉它,那么它就没有用了。否则,每次创建新对象时都会重新编译它。 - dmportella
我尝试修改代码,但结果似乎仍然不同。我已经使用VS 2010内置的XSL处理器(而非代码)进行了检查,并且每次运行都显示出不同的结果。我认为唯一的选择是采用样式表执行时间的平均值。 - thinkster
是的,这是相同的数据,但IDE报告不同的执行时间。我想知道微软是否有任何东西。尽管他们有支持XSL的大计划,但我并没有看到太多相关信息。 - thinkster
好的。嗯,也许你应该再审查一下那个。顺便问一下,你为什么要使用XSLT? - dmportella
显示剩余11条评论

1

是的,我采用了取平均值的想法,但我不确定上述数值——MSDN没有提供有关这些数值的详细信息。出于某种原因,我现在无法访问http://xmllondon.com/2014/xmllondon-2014-proceedings.pdf。谢谢。 - thinkster
看起来微软除了提供我上面引用的基本IDE值之外,没有其他解决方案。我不确定是否有其他产品(如XMLSpy或StylusStudio)提供这样的功能。 - thinkster
1
XT-Speedo包括针对多个XSLT处理器的测量驱动程序,包括Microsoft的XslCompiledTransform。您可以在http://www.saxonica.com/papers/xmllondon-2014mhk.pdf找到我们论文的另一个副本。 - Michael Kay
太棒了,这是一篇非常详尽的论文。我会去看看XT-Speedo。谢谢你提供的指引! - thinkster

0

总结一下,我为那些未来可能参考这个帖子的人提供一个快速参考:

对于.NET,最简单的基准测试方法是使用XSLT分析器。但问题在于它只能在安装了Microsoft Visual Studio Team System with Profiling Tools的情况下使用。

另一个可用的好选择是来自Saxonica的开源工具XT-Speedo。试试看。

除此之外,为了进行快速而粗略的评估,您可以运行多个XSL转换,并使用一个简单的StopWatch Tick来获得平均值,在大多数情况下这可能已经足够了。


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