Performance XSLT性能
我正在为一个有很多XSLT转换的项目工作。 转换必须尽可能快 为了可读性,我写了很多文章,将“业务逻辑”和 “产出”。比如说Performance XSLT性能,performance,xslt,Performance,Xslt,我正在为一个有很多XSLT转换的项目工作。 转换必须尽可能快 为了可读性,我写了很多文章,将“业务逻辑”和 “产出”。比如说 <!-- Business Logic --> <xsl:variable name="myLocalVar"> <xsl:value-of select="func:whateverComputation(params)" /> </xsl:variable> <!-- more buss logic
<!-- Business Logic -->
<xsl:variable name="myLocalVar">
<xsl:value-of select="func:whateverComputation(params)" />
</xsl:variable>
<!-- more buss logic here -->
<!-- Output -->
<xsl:element name="mytag">
<xsl:value-of select="$myLocalVar" />
</xsl:element>
当然,这可以写在一个紧凑的形式
<xsl:element name="mytag">
<xsl:value-of select="func:whateverComputation(params)" />
</xsl:element>
第一种形式比第二种形式慢吗?来自以下部分:
与XSLT性能相关的几点:
xsl:variables
是动态值。这些变量不在缓存中,每次在XSL中引用它们时都会运行。xsl:variable
的显式类型转换提高了性能。您可以使用string()
和boolean()
函数进行类型转换
例如:
。例如,通过使用position()
解决分组问题
node-set()
扩展函数访问它#PCDATA
元素的文本值,请优先使用
在一般情况下,将函数应用程序的结果保存到一个变量不会对性能产生任何显著影响(有些XSLT处理器(如Saxon)使用延迟求值,因此在实际需要变量之前不会对函数求值) 相反如果必须使用相同的参数多次计算函数,则将结果保存在变量中可能会在某些情况下显著提高效率 提高性能的正确方法是:
引用Donald Knuth的话:“过早优化是万恶之源”——这实际上是一句名言的改写:“通往地狱的路是由善意铺成的。”游戏开始有点晚了,但我想我应该分享这个链接:。我们无法回答这个问题。我们甚至不知道您使用的是什么XSLT处理器。唯一确定的方法是自己对其进行基准测试。(另外,将业务逻辑放在模板中似乎根本不明智。)我同意阿维拉的观点。但请注意,xsl:variable声明显示了一个常见错误:将其更改为
。我已经看到,在样式表中应用此更改可以使速度提高3倍,更不用说使代码更加简洁易读了。将复杂转换拆分为多个阶段有什么好处?更好的内存利用率?转换会更快,而且可以在需要的任何地方重用。当你说“重用”时,你是指在处理过程中重用还是指模块化?我有点困惑。您会说“这些变量不在缓存中,并且每次在XSL中引用它们时都会运行”,但也会说“不要对同一个节点集进行多次求值,请将其保存在变量中”。如果我做了
,那不是每次都会重新计算吗?如果使用,那么每次使用变量时都会计算“/node”,但是可能会导致在某些xslt处理器中缓存该值,请参见quot the raven:404。