我正在为一个有许多XSLT转换的项目工作.转换必须尽可能快.
为了便于阅读,我写了许多将"业务逻辑"和"输出"分开的内容.例如
<!-- 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>
Run Code Online (Sandbox Code Playgroud)
当然,这可以用紧凑的形式编写
<xsl:element name="mytag">
<xsl:value-of select="func:whateverComputation(params)" />
</xsl:element>
Run Code Online (Sandbox Code Playgroud)
第一种形式比第二种慢吗?
Siv*_*ran 12
xsl:variables是动态值.这些变量不在缓存中,并且每次在XSL中引用它们时都会运行.显式类型转换xsl:variable可提高性能.您可以使用string()和boolean()函数进行类型转换.
例如:
<xsl:variable name="_attr" select="string( /node/child[ @attr ] )">
而不是使用子元素,尽可能使用属性.使用属性而不是元素可以提高性能.执行XPath匹配时,属性更快,因为它们是松散类型的.这使得模式的验证更容易.
与属性值匹配时,请使用枚举器属性.使用多个属性名称作为位,并将其值设置为true或false.
保持源文档较小.如有必要,首先拆分文档.
在运行之间保持XSLT处理器(和Java VM)加载到内存中
如果重复使用相同的样式表,请先编译它.
如果重复使用相同的源文档,请将其保留在内存中.
如果重复执行相同的转换,请不要.改为存储结果.
保持输出文档很小.例如,如果您要生成HTML,请使用CSS.
切勿多次验证同一源文档.
将复杂的转换分成几个阶段.
避免重复使用"// item".
不要多次评估相同的节点集; 将其保存在变量中.
<xsl:number>如果可以,请避免.例如,通过使用position().
使用<xsl:key>,例如解决问题的分组.
避免模板规则中的复杂模式.相反,<xsl:choose>在规则中使用.
使用preceding[-sibling]或following[-sibling]轴时要小心.这通常表示具有n平方性能的算法.
不要多次对同一节点集进行排序.如有必要,将其保存为结果树片段并使用node-set()扩展功能访问它.
要输出简单#PCDATA元素的文本值,请<xsl:value-of>优先使用<xsl:apply-templates>.
Dim*_*hev 10
将函数应用程序的结果保存到变量不会对一般情况下的性能产生任何重大影响(并且某些XSLT处理器(如Saxon)使用惰性求值,因此不会对函数进行求值,直到实际需要变量为止) .
相反,如果必须使用相同的参数对函数进行多次评估,则将结果保存在变量中可能会导致某些情况显着提高效率.
提高性能的正确方法是:
配置文件/措施,以确定真正的瓶颈.
优化最大的瓶颈.
如果仍然需要提高性能,请开始新的迭代,转到1.上面.
引用唐纳德·克努特的话说:" 过早的优化是所有邪恶的根源 " - 这实际上是一句众所周知的谚语:" 通往地狱的道路铺满了良好的意图."
| 归档时间: |
|
| 查看次数: |
13364 次 |
| 最近记录: |