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

Subject: Re: [xsl] Performance of xsl:for-each with key() lookup
From: "Alan Painter alan.painter@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 26 Sep 2018 21:00:47 -0000
10 years old and still giving great value.

On Wed, Sep 26, 2018, 22:54 Michael Kay mike@xxxxxxxxxxxx <
xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:

> 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