Re: [xsl] Here's how to benchmark your XSLT program's execution time

Subject: Re: [xsl] Here's how to benchmark your XSLT program's execution time
From: "Costello, Roger L. costello@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 6 Nov 2014 15:05:32 -0000
> Order of evaluation is undefined in XSLT, and there is no guarantee
> that $start is evaluated before the apply-templates call is evaluated.

Yikes!

So how do I write the XSLT program so that it is guaranteed that $start will
be evaluated before the apply-templates call is evaluated?

/Roger

-----Original Message-----
From: Michael Kay mike@xxxxxxxxxxxx
[mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx]
Sent: Thursday, November 06, 2014 9:49 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] Here's how to benchmark your XSLT program's execution time

If this is working, then it's only by chance.

Order of evaluation is undefined in XSLT, and there is no guarantee that
$start is evaluated before the apply-templates call is evaluated.

I think this only works in Saxon because the optimizer treats calls on
extension functions as suspicious, and tries to avoid over-optimizing them
because of potential side-effects.

Michael Kay
Saxonica
mike@xxxxxxxxxxxx
+44 (0) 118 946 5893




On 6 Nov 2014, at 10:20, Costello, Roger L. costello@xxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:

> Hi Folks,
>
> So, you've got an XSLT program that is taking a long time to execute. You
want to find out what part of the program is taking so much time.  You need to
insert some start/stop timers into your XSLT. Here's how to do it:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>                xmlns:date="java:java.util.Date"
>                version="2.0">
>
>    <xsl:output method="text" />
>    <xsl:output name="text-format" method="text"/>
>
>    <xsl:template match="/">
>        <!-- Start a timer -->
>        <xsl:variable name="start" select="date:getTime(date:new())" />
>
>        <!-- Do your XSLT processing -->
>        <xsl:apply-templates />
>
>        <!-- End the timer -->
>        <xsl:variable name="end" select="date:getTime(date:new())" />
>
>        <!-- Log the benchmarking results to a file, time-info.txt -->
>        <xsl:result-document href="time-info.txt" format="text-format">
>            start: <xsl:value-of select="$start" />
>            end: <xsl:value-of select="$end" />
>            diff: <xsl:value-of select="$end - $start" />
>        </xsl:result-document>
>
>    </xsl:template>
>
>    <xsl:template match="*">
>        <!-- Do something -->
>        <xsl:text>Hello World </xsl:text>
>        <xsl:value-of select="current-dateTime()" />
>    </xsl:template>
>
> </xsl:stylesheet>

Current Thread