|
Subject: RE: [xsl] Different performance of nodesets created in different ways From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Fri, 1 Feb 2008 10:58:13 -0000 |
Performance questions like this are very product dependent. The node-set()
function in one processor might involve a major reorganization of the
underlying data structure, in another it might be a no-op. I think you're
better off discussing this on a Xalan list. However, I think there are one
or two points that one can make that are product-independent.
> <xsl:template name="bigMemoryUsage">
> <xsl:variable name="big">
// result tree fragment
> <xsl:copy-of select="/a/b"/>
> </xsl:variable>
> <xsl:for-each select="/a/b">
> <xsl:variable name="i" select="position()"/>
> <xsl:value-of
> select="xalan:nodeset($big)/b[position()=$i]"/>
> </xsl:for-each>
If the implementation of nodeset() does involve major reorganisation, and if
the processor doesn't do very advanced optimisation, then you're going to
get a big saving by moving the call on nodeset() outside the loop.
>
> When I changed the <xsl:variable> to get its value from the
> select="..." attribute, i.e. to be of type node-set, and
> removed the call to xalan:nodeset() - my test case used a quarter as much
memory.
Not really a surprise - one is copying the data, the other isn't. A factor
of 4 seems a bit high, though. Perhaps Xalan's nodeset() function is making
a second copy.
>
> The two versions of the stylesheet process the same nodes (or
> a copy of the same nodes) and produce the same output.
I'm a bit surprised by that. I would have expected this:
<xsl:variable name="small" select="/a/b"/>
<xsl:for-each select="/a/b">
<xsl:variable name="i" select="position()"/>
<xsl:value-of select="$small/b[position()=$i]"/>
</xsl:for-each>
to produce no output because $small is a set of b elements, which have no
children called b.
The performance difference is presumably some quirk of when Xalan does
direct addressing into a node-set and when it has to do a scan. The results
are unlikely to extrapolate to a different processor.
I'd be interested to see how the Saxon results compare. Saxon for example
when you do the xsl:copy-of will create a virtual copy so the memory
overhead may be much less. Of course with XSLT 2.0 you don't need a
node-set() call.
Michael Kay
http://www.saxonica.com/
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] Different performance of node, TAYLOR Peter J \(AXA | Thread | [xsl] XSLT2, collection(), and xsl:, James Cummings |
| [xsl] Different performance of node, TAYLOR Peter J \(AXA | Date | [xsl] XSLT2, collection(), and xsl:, James Cummings |
| Month |