Performance 是什么导致XSLT性能极差:文本片段还是优先级?
我正在尝试使用XSLT进行一些清理。我想对文本片段做一些更改,并让所有其他节点保持安静。但是,我当前的实现运行非常慢,并且消耗了大量内存。删除一个小模板会将运行时间从一分钟更改为几分之一秒 这是XSLT:Performance 是什么导致XSLT性能极差:文本片段还是优先级?,performance,xslt,xpath,saxon,Performance,Xslt,Xpath,Saxon,我正在尝试使用XSLT进行一些清理。我想对文本片段做一些更改,并让所有其他节点保持安静。但是,我当前的实现运行非常慢,并且消耗了大量内存。删除一个小模板会将运行时间从一分钟更改为几分之一秒 这是XSLT: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:import href="../common/identity.xsl"/> &l
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:import href="../common/identity.xsl"/>
<xsl:template match="text()" priority="100">
<xsl:variable name="pass1" select="replace(., '(_|~)', ' ')"/>
<xsl:variable name="pass2" select="replace($pass1, ' , ', ', ')"/>
<xsl:variable name="final" select="$pass2"/>
<xsl:value-of select="$final"/>
</xsl:template>
<xsl:template match="body/text()[1][. = ' '] | body/text()[last()][. = ' ']"
priority="200"/>
</xsl:stylesheet>
第一个模板替换一些字符,第二个模板删除第一个和最后一个文本片段,但前提是它们只包含一个空格(遗憾的是规范化空格不符合我的需要)
这个XSLT运行非常慢,并且消耗大量内存。如果删除最后的模板,同样的XSLT运行速度很快,并且使用正常的内存量
XSLT是使用Saxon-(HE | EE)9.5.1.3在oXygen 15.2中运行的
是什么导致了如此大的性能损失?是不是一般都使用了文本片段?优先权的使用?使用[1]
和[last()]
使用not(以下同级::text())代替last()修复了该问题。你能解释一下为什么或者给一些关于last()的问题的建议吗
评估模式有两种方式:从左到右和从右到左,对应于规范第5.5.3节中给出的“正式”和“非正式”语义。从右到左的方法效率更高,但不能用于所有模式;特别是,使用位置谓词的模式非常棘手。Saxon将有效地处理许多情况,包括match=“para[last()]”
,但对于其他一些情况,包括match=“para[last()-1]”
和(似乎)match=“section/para[last()]”
,它采取了缓慢但有条理的路线。我将看一看代码,看看是否可以改进。那么您到底使用哪个版本的XSLT处理器?你是怎么运作的?您是否尝试使用其概要文件工具,例如,Saxon 9具有-t
选项和-TP
选项。你试过不同的处理器吗?我不明白为什么禁止复制某些文本节点的模板会显著增加内存使用量。性能完全取决于您使用的XSLT处理器,因此我们需要这些信息。我的怀疑将落在谓词[last()]上。试试[not(跟随兄弟::text())]看看是否效果更好。@MartinHonnen,我用的是Saxon 9。我用相关细节更新了问题。在发布这些问题之前,我也使用了分析工具,但它们没有显示任何内容。我将尝试格式化分析工具的输出并将其添加到问题中。@MichaelKay,使用not(跟随兄弟::text())
而不是last()
修复了它。你能解释一下为什么或者给一些关于last()
的问题的建议吗?