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: "Eliot Kimber ekimber@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 6 Nov 2014 17:09:10 -0000
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.
bbbbb
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