Re: [xsl] Performance of xsl:for-each with key() lookup

Subject: Re: [xsl] Performance of xsl:for-each with key() lookup
From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 26 Sep 2018 20:54:08 -0000
The answer obviously depends on the processor.

With Saxon, if a variable is only referenced once, and the reference isn't in
a loop, then it will be inlined. So if you write

>   <xsl:variable name="elems" select="key('some', $value, $doc)"
> as="element()*"/>
>    <xsl:for-each select="$elems">

then Saxon will rewrite it as

>  <xsl:for-each select="key('some', $value, $doc)">

The main benefit of this rewrite is better pipelining. A variable causes the
list of items to be stored somewhere in memory; without the variable, each
item is processed as soon as it is found.

Michael Kay
Saxonica

PS: Saxon 9.1 is about 10 years ago, so my memory of it is rather rusty.


> On 26 Sep 2018, at 21:40, Martynas JuseviD
ius martynas@xxxxxxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> Hi,
>
> I'm using the following pattern in multiple places in my stylesheets:
>
>    <xsl:for-each select="key('some', $value, $doc)">
>
> My question is, would iteration be optimized if I selected the nodes
> into a variable first?
>
>    <xsl:variable name="elems" select="key('some', $value, $doc)"
> as="element()*"/>
>    <xsl:for-each select="$elems">
>
> I guess it should be faster if the key() function is called only once
> instead of multiple times? But if there is an index maybe it doesn't
> matter?
>
> And does the same apply to
>
>    <xsl:apply-templates select="key('some', $value, $doc)"/>
>
> as well?
>
> I'm using Saxon 9.1.0.8.
>
>
> Martynas

Current Thread