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: "Wolfgang Laun wolfgang.laun@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 6 Nov 2014 17:44:33 -0000
What does this tell you? The time for 10...0 iterations of an xsl:for-each?
Or of an xsl:variable? Or an xsl:sequence? Or how well equipped your system
is to output text to standard output?

I'd like to know the cost of one iteration plus the creation of a variable.

-W



On 6 November 2014 18:09, Eliot Kimber ekimber@xxxxxxxxxxxx <
xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:

> Here's my test:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet version="2.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>   xmlns:df="http://dita2indesign.org/dita/functions";
> xmlns:xs="http://www.w3.org/2001/XMLSchema";
>   xmlns:relpath="http://dita2indesign/functions/relpath";
> xmlns:glossdata="http://dita4publishers.org/glossdata";
>   xmlns:applicability="http://dita4publishers.org/applicability";
>   xmlns:mapdriven="http://dita4publishers.org/mapdriven";
>   xmlns:local="urn:functions:local"
> xmlns:index-terms="http://dita4publishers.org/index-terms";
>   xmlns:date="java:java.util.Date"
>   xmlns:enum="http://dita4publishers.org/enumerables";
> exclude-result-prefixes="local xs df xsl relpath glossdata date">
>
>   <xsl:template match="/" name="start">
>     <xsl:variable name="startTime" select="date:getTime(date:new())"/>
>     <xsl:message> + [DEBUG] Start time: <xsl:value-of
> select="$startTime"/> milliseconds</xsl:message>
>     <xsl:for-each select="1 to 100000000">
>       <xsl:variable name="foo" select="."/>
>       <xsl:sequence select="$foo"/>
>     </xsl:for-each>
>     <xsl:variable name="endTime" select="date:getTime(date:new())"/>
>     <xsl:message> + [DEBUG] End time: <xsl:value-of select="$endTime"/>
> milliseconds</xsl:message>
>     <xsl:variable name="elapsed" as="xs:integer" select="$endTime -
> $startTime"/>
>     <xsl:message> + [DEBUG] Elapsed time: <xsl:value-of select="$elapsed
> div 1000"/> seconds</xsl:message>
>
>   </xsl:template>
>
> </xsl:stylesheet>
>
>
> Which produces this result for me when run from Oxygen:
>
> + [DEBUG] Start time: 1415293570616
> + [DEBUG] End time: 1415293596900
> + [DEBUG] Elapsed time: 26.284 seconds
>
> Cheers,
>
>
> E.
> ----------
> Eliot Kimber, Owner
> Contrext, LLC
> http://contrext.com
>
>
>
>
> On 11/6/14, 9:05 AM, "Costello, Roger L. costello@xxxxxxxxx"
> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> >> 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