Hello Malia,

maybe you should try catchXSL! to profile your stylesheet.
see http://www.xslprofiler.org

regards
maggie

> Sorry, I didn't attach the xsl file.
>
>
>
> -----Original Message-----
> From: Malia Zaheer [mailto:[EMAIL PROTECTED]
> Sent: Thursday, July 25, 2002 10:55 AM
> To: Joseph Kesselman; Frank E. Weiss
> Cc: [EMAIL PROTECTED]
> Subject: RE: FW: transformer hangs
>
>
> After using XSLTC instead of interpretive XSLT and using SAXSource
> instead of
> StreamSource for input, the performance increased significantly, but
> not yet optimal.  Here are the results:
>
> 25KB xml - took 14 sec
> 50KB xml - took 70 sec
> 75KB xml - took 220 sec
>
> I know that the stylesheet that I am using is not efficient.  That is
> because I am generating that stylesheet programmatically, not by hand
> so that I can optimize it for each input.  Here is the stylesheet (I
> know it's hard to read, but it's just nested for-each, if and variable
> statements followed by choose statement).  I have also attached it to
> this email if you want to open it in IE, it's easier to read.
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> exclude-result-prefixes="java" version="1.0"
> xmlns:java="http://xml.apache.org/xslt/java";><xsl:output indent="yes"
> method="xml"/><xsl:template match="/"><xsl:element
> name="document"><xsl:call-template
> name="template_1"/></xsl:element></xsl:template>
>
>
> <xsl:template name="template_1">
> <xsl:for-each select="/document/record/Flags[not(preceding::Flags=.)]">
> <xsl:variable name="Flags_1" select="."/>
> <xsl:if test="/document[record[Flags=$Flags_1]]">
> <xsl:for-each
> select="/document/record/SPM_RegioId[not(preceding::SPM_RegioId=.)]">
> <xsl:variable name="SPM_RegioId_2" select="."/>
> <xsl:if
> test="/document[record[Flags=$Flags_1][SPM_RegioId=$SPM_RegioId_2]]">
> <xsl:for-each
> select="/document/record/SPM_DeviceId[not(preceding::SPM_DeviceId=.)]">
> <xsl:variable name="SPM_DeviceId_3" select="."/>
> <xsl:if
> test="/document[record[SPM_DeviceId=$SPM_DeviceId_3][Flags=$Flags_1]
[SPM_Reg
> ioId=$SPM_RegioId_2]]">
> <xsl:for-each
> select="/document/record/SUB_Instance[not(preceding::SUB_Instance=.)]">
> <xsl:variable name="SUB_Instance_4" select="."/>
> <xsl:if
> test="/document[record[SPM_DeviceId=$SPM_DeviceId_3][Flags=$Flags_1]
[SUB_Ins
> tance=$SUB_Instance_4][SPM_RegioId=$SPM_RegioId_2]]">
> <xsl:for-each
> select="/document/record/SPM_SubId[not(preceding::SPM_SubId=.)]">
> <xsl:variable name="SPM_SubId_5" select="."/>
> <xsl:if
> test="/document[record[SPM_DeviceId=$SPM_DeviceId_3][Flags=$Flags_1]
[SUB_Ins
> tance=$SUB_Instance_4][SPM_SubId=$SPM_SubId_5]
[SPM_RegioId=$SPM_RegioId_2]]"
>>
> <xsl:for-each
> select="/document/record/SPM_IspId[not(preceding::SPM_IspId=.)]">
> <xsl:variable name="SPM_IspId_6" select="."/><xsl:if
> test="/document[record[SPM_DeviceId=$SPM_DeviceId_3][Flags=$Flags_1]
[SUB_Ins
> tance=$SUB_Instance_4][SPM_SubId=$SPM_SubId_5][SPM_RegioId=$SPM_RegioId_2]
[S
> PM_IspId=$SPM_IspId_6]]">
> <xsl:for-each
> select="/document/record/TimeStamp[not
(preceding::TimeStamp=.)]"><xsl:variab
> le name="TimeStamp_7" select="."/>
> <xsl:if
> test="/document[record[SPM_DeviceId=$SPM_DeviceId_3][Flags=$Flags_1]
[SUB_Ins
> tance=$SUB_Instance_4][SPM_SubId=$SPM_SubId_5][SPM_RegioId=$SPM_RegioId_2]
[T
> imeStamp=$TimeStamp_7][SPM_IspId=$SPM_IspId_6]]">
> <xsl:for-each
> select="/document/record/SPM_TRUNKID[not
(preceding::SPM_TRUNKID=.)]"><xsl:va
> riable name="SPM_TRUNKID_8" select="."/>
> <xsl:if
> test="/document[record[SPM_DeviceId=$SPM_DeviceId_3][Flags=$Flags_1]
[SPM_TRU
> NKID=$SPM_TRUNKID_8][SUB_Instance=$SUB_Instance_4][SPM_SubId=$SPM_SubId_5]
[S
> PM_RegioId=$SPM_RegioId_2][TimeStamp=$TimeStamp_7]
[SPM_IspId=$SPM_IspId_6]]"
>>
> <xsl:for-each
> select="/document/record/IFI_IPACKETS[not
(preceding::IFI_IPACKETS=.)]"><xsl:
> variable name="IFI_IPACKETS_9" select="."/>
> <xsl:if
> test="/document[record[SPM_SubId=$SPM_SubId_5]
[IFI_IPACKETS=$IFI_IPACKETS_9]
> [Flags=$Flags_1][SPM_RegioId=$SPM_RegioId_2][SPM_TRUNKID=$SPM_TRUNKID_8]
[SUB
> _Instance=$SUB_Instance_4][SPM_DeviceId=$SPM_DeviceId_3]
[SPM_IspId=$SPM_IspI
> d_6][TimeStamp=$TimeStamp_7]]">
> <xsl:for-each
> select="/document/record/IFI_OPACKETS[not(preceding::IFI_OPACKETS=.)]">
> <xsl:variable name="IFI_OPACKETS_10" select="."/><xsl:if
> test="/document[record[SPM_SubId=$SPM_SubId_5]
[IFI_IPACKETS=$IFI_IPACKETS_9]
> [IFI_OPACKETS=$IFI_OPACKETS_10][Flags=$Flags_1]
[SPM_RegioId=$SPM_RegioId_2][
> SPM_TRUNKID=$SPM_TRUNKID_8][SUB_Instance=$SUB_Instance_4]
[SPM_DeviceId=$SPM_
> DeviceId_3][SPM_IspId=$SPM_IspId_6][TimeStamp=$TimeStamp_7]]">
> <xsl:for-each
> select="/document/record/IFI_IBYTES[not
(preceding::IFI_IBYTES=.)]"><xsl:vari
> able name="IFI_IBYTES_11" select="."/>
> <xsl:if
> test="/document[record[SPM_SubId=$SPM_SubId_5]
[IFI_IPACKETS=$IFI_IPACKETS_9]
> [IFI_OPACKETS=$IFI_OPACKETS_10][Flags=$Flags_1]
[SPM_RegioId=$SPM_RegioId_2][
> IFI_IBYTES=$IFI_IBYTES_11][SPM_TRUNKID=$SPM_TRUNKID_8]
[SUB_Instance=$SUB_Ins
> tance_4][SPM_DeviceId=$SPM_DeviceId_3][SPM_IspId=$SPM_IspId_6]
[TimeStamp=$Ti
> meStamp_7]]">
> <xsl:for-each
> select="/document/record/IFI_OBYTES[not(preceding::IFI_OBYTES=.)]">
> <xsl:variable name="IFI_OBYTES_12" select="."/><xsl:if
> test="/document[record[SPM_SubId=$SPM_SubId_5]
[IFI_IPACKETS=$IFI_IPACKETS_9]
> [IFI_OBYTES=$IFI_OBYTES_12][IFI_OPACKETS=$IFI_OPACKETS_10][Flags=$Flags_1]
[S
> PM_RegioId=$SPM_RegioId_2][IFI_IBYTES=$IFI_IBYTES_11]
[SPM_TRUNKID=$SPM_TRUNK
> ID_8][SUB_Instance=$SUB_Instance_4][SPM_DeviceId=$SPM_DeviceId_3]
[SPM_IspId=
> $SPM_IspId_6][TimeStamp=$TimeStamp_7]]"><xsl:for-each
> select="/document/record/IFI_IQDROPS[not
(preceding::IFI_IQDROPS=.)]"><xsl:va
> riable name="IFI_IQDROPS_13" select="."/>
> <xsl:if
> test="/document[record[SPM_SubId=$SPM_SubId_5]
[IFI_IPACKETS=$IFI_IPACKETS_9]
> [IFI_OBYTES=$IFI_OBYTES_12][IFI_OPACKETS=$IFI_OPACKETS_10][Flags=$Flags_1]
[I
> FI_IQDROPS=$IFI_IQDROPS_13][SPM_RegioId=$SPM_RegioId_2]
[IFI_IBYTES=$IFI_IBYT
> ES_11][SPM_TRUNKID=$SPM_TRUNKID_8][SUB_Instance=$SUB_Instance_4]
[SPM_DeviceI
> d=$SPM_DeviceId_3][SPM_IspId=$SPM_IspId_6]
[TimeStamp=$TimeStamp_7]]"><xsl:fo
> r-each
> select="/document/record/IFI_OQDROPS[not(preceding::IFI_OQDROPS=.)]">
> <xsl:variable name="IFI_OQDROPS_14" select="."/>
> <xsl:if
> test="/document[record[SPM_SubId=$SPM_SubId_5]
[IFI_IPACKETS=$IFI_IPACKETS_9]
> [IFI_OBYTES=$IFI_OBYTES_12][IFI_OPACKETS=$IFI_OPACKETS_10][Flags=$Flags_1]
[I
> FI_IQDROPS=$IFI_IQDROPS_13][SPM_RegioId=$SPM_RegioId_2]
[IFI_IBYTES=$IFI_IBYT
> ES_11][SPM_TRUNKID=$SPM_TRUNKID_8][SUB_Instance=$SUB_Instance_4]
[SPM_DeviceI
> d=$SPM_DeviceId_3][SPM_IspId=$SPM_IspId_6][TimeStamp=$TimeStamp_7]
[IFI_OQDRO
> PS=$IFI_OQDROPS_14]]">
> <xsl:for-each
> select="/document/record/PKTS_DROP_ERR[not
(preceding::PKTS_DROP_ERR=.)]"><xs
> l:variable name="PKTS_DROP_ERR_15" select="."/>
> <xsl:if
> test="/document[record[SPM_SubId=$SPM_SubId_5]
[IFI_IPACKETS=$IFI_IPACKETS_9]
> [IFI_OBYTES=$IFI_OBYTES_12][IFI_OPACKETS=$IFI_OPACKETS_10][Flags=$Flags_1]
[I
> FI_IQDROPS=$IFI_IQDROPS_13][SPM_RegioId=$SPM_RegioId_2]
[IFI_IBYTES=$IFI_IBYT
> ES_11][PKTS_DROP_ERR=$PKTS_DROP_ERR_15][SPM_TRUNKID=$SPM_TRUNKID_8]
[SUB_Inst
> ance=$SUB_Instance_4][SPM_DeviceId=$SPM_DeviceId_3]
[SPM_IspId=$SPM_IspId_6][
> TimeStamp=$TimeStamp_7][IFI_OQDROPS=$IFI_OQDROPS_14]]"><xsl:for-each
> select="/document/record/MULTICAST_IN_PKTS[not
(preceding::MULTICAST_IN_PKTS=
> .)]">
> <xsl:variable name="MULTICAST_IN_PKTS_16" select="."/>
> <xsl:if
> test="/document[record[SPM_SubId=$SPM_SubId_5]
[IFI_IPACKETS=$IFI_IPACKETS_9]
> [MULTICAST_IN_PKTS=$MULTICAST_IN_PKTS_16][IFI_OBYTES=$IFI_OBYTES_12]
[IFI_OPA
> CKETS=$IFI_OPACKETS_10][Flags=$Flags_1][IFI_IQDROPS=$IFI_IQDROPS_13]
[SPM_Reg
> ioId=$SPM_RegioId_2][IFI_IBYTES=$IFI_IBYTES_11]
[PKTS_DROP_ERR=$PKTS_DROP_ERR
> _15][SPM_TRUNKID=$SPM_TRUNKID_8][SUB_Instance=$SUB_Instance_4]
[SPM_DeviceId=
> $SPM_DeviceId_3][SPM_IspId=$SPM_IspId_6][TimeStamp=$TimeStamp_7]
[IFI_OQDROPS
> =$IFI_OQDROPS_14]]">
> <xsl:for-each
> select="/document/record/MULTICAST_OUT_PKTS[not
(preceding::MULTICAST_OUT_PKT
> S=.)]"><xsl:variable name="MULTICAST_OUT_PKTS_17" select="."/>
> <xsl:choose>
> <xsl:when
> test="/document[record[SPM_SubId=$SPM_SubId_5]
[IFI_IPACKETS=$IFI_IPACKETS_9]
> [MULTICAST_IN_PKTS=$MULTICAST_IN_PKTS_16][IFI_OBYTES=$IFI_OBYTES_12]
[IFI_OPA
> CKETS=$IFI_OPACKETS_10][Flags=$Flags_1]
[MULTICAST_OUT_PKTS=$MULTICAST_OUT_PK
> TS_17][IFI_IQDROPS=$IFI_IQDROPS_13][SPM_RegioId=$SPM_RegioId_2]
[IFI_IBYTES=$
> IFI_IBYTES_11][PKTS_DROP_ERR=$PKTS_DROP_ERR_15]
[SPM_TRUNKID=$SPM_TRUNKID_8][
> SUB_Instance=$SUB_Instance_4][SPM_DeviceId=$SPM_DeviceId_3]
[SPM_IspId=$SPM_I
> spId_6][TimeStamp=$TimeStamp_7][IFI_OQDROPS=$IFI_OQDROPS_14]]">
> <xsl:element name="record"><xsl:element name="Flags"><xsl:value-of
> select="$Flags_1"/></xsl:element><xsl:element
> name="SPM_RegioId"><xsl:value-of
> select="$SPM_RegioId_2"/></xsl:element> <xsl:element
> name="SPM_DeviceId"><xsl:value-of
> select="$SPM_DeviceId_3"/></xsl:element>
> <xsl:element name="SUB_Instance"><xsl:value-of
> select="$SUB_Instance_4"/></xsl:element>
> <xsl:element name="SPM_SubId"><xsl:value-of
> select="$SPM_SubId_5"/></xsl:element>
> <xsl:element name="SPM_IspId"><xsl:value-of
> select="$SPM_IspId_6"/></xsl:element>
> <xsl:element name="TimeStamp"><xsl:value-of
> select="$TimeStamp_7"/></xsl:element>
> <xsl:element name="SPM_TRUNKID"><xsl:value-of
> select="$SPM_TRUNKID_8"/></xsl:element>
> <xsl:element name="IFI_IPACKETS"><xsl:value-of
> select="$IFI_IPACKETS_9"/></xsl:element>
> <xsl:element name="IFI_OPACKETS"><xsl:value-of
> select="$IFI_OPACKETS_10"/></xsl:element>
> <xsl:element name="IFI_IBYTES"><xsl:value-of
> select="$IFI_IBYTES_11"/></xsl:element>
> <xsl:element name="IFI_OBYTES"><xsl:value-of
> select="$IFI_OBYTES_12"/></xsl:element>
> <xsl:element name="IFI_IQDROPS"><xsl:value-of
> select="$IFI_IQDROPS_13"/></xsl:element>
> <xsl:element name="IFI_OQDROPS"><xsl:value-of
> select="$IFI_OQDROPS_14"/></xsl:element>
> <xsl:element name="PKTS_DROP_ERR"><xsl:value-of
> select="$PKTS_DROP_ERR_15"/></xsl:element><xsl:element
> name="MULTICAST_IN_PKTS"><xsl:value-of
> select="$MULTICAST_IN_PKTS_16"/></xsl:element><xsl:element
> name="MULTICAST_OUT_PKTS"><xsl:value-of
> select="$MULTICAST_OUT_PKTS_17"/></xsl:element></xsl:element>
> </xsl:when>
> </xsl:choose>
> </xsl:for-each>
> </xsl:if>
> </xsl:for-each></xsl:if></xsl:for-each></xsl:if></xsl:for-
each></xsl:if></xs
> l:for-each></xsl:if></xsl:for-each></xsl:if></xsl:for-
each></xsl:if></xsl:fo
> r-each></xsl:if></xsl:for-each></xsl:if></xsl:for-each></xsl:if></xsl:for-
ea
> ch></xsl:if></xsl:for-each></xsl:if></xsl:for-each></xsl:if></xsl:for-
each><
> /xsl:if></xsl:for-each></xsl:if></xsl:for-each></xsl:if></xsl:for-
each></xsl
> :template></xsl:stylesheet>
>
>
> And sample data record is:
>
> <record><Flags>0</Flags>
> <SPM_RegioId>1</SPM_RegioId>
> <SPM_DeviceId>1</SPM_DeviceId>
> <SUB_Instance>-1</SUB_Instance>
> <SPM_SubId>-1</SPM_SubId>
> <SPM_IspId>6</SPM_IspId>
> <TimeStamp>Thu Jul 04 17:40:30 EDT 2002</TimeStamp>
> <SPM_TRUNKID>45</SPM_TRUNKID>
> <IFI_IPACKETS>113</IFI_IPACKETS>
> <IFI_OPACKETS>219</IFI_OPACKETS>
> <IFI_IBYTES>7002</IFI_IBYTES>
> <IFI_OBYTES>13038</IFI_OBYTES>
> <IFI_IQDROPS>0</IFI_IQDROPS>
> <IFI_OQDROPS>0</IFI_OQDROPS>
> <PKTS_DROP_ERR>0</PKTS_DROP_ERR>
> <MULTICAST_IN_PKTS>6760</MULTICAST_IN_PKTS>
> <MULTICAST_OUT_PKTS>0</MULTICAST_OUT_PKTS>
> </record>
>
>
> Do you know of a good site that focus on stylesheet efficiency?
>
> -----Original Message-----
> From: Joseph Kesselman [mailto:[EMAIL PROTECTED]
> Sent: Thursday, July 25, 2002 9:46 AM
> To: Frank E. Weiss
> Cc: [EMAIL PROTECTED]
> Subject: Re: FW: transformer hangs
>
>
>>If a lot of cross-referencing of the input document is occuring,
>>then the process can increase super-linearly, that is to say,
> exponentially or >factorially.
>
> Note that there isn't much in XSLT or XPath, per se, which scales worse
>  than linearly -- but there are many ways to write a path or stylesheet
>  which does. Also, of course, if you're processing something large
> enough  to drive your system into heavy swapping to disk you can expect
> to see a  knee in the curve.
>
> So I'm still inclined to agree that this is most likely an inefficient
> stylesheet. It may well be one that _can't_ be written efficiently;
> convolving multiple lists against each other is sometimes necessary and
>  always expensive... but it might be a good idea to look at one of the
> websites which suggest ways of improving stylesheet efficiency, and see
>  whether any of those tips apply to what you're trying to do.
>
> ______________________________________
> Joe Kesselman  / IBM Research


-- 
Magdalena Piller
  eCube GmbH, Muenchen
  Phone: +49 89 383892-39
  Fax:   +49 89 383892-99
  mailto:[EMAIL PROTECTED]



Reply via email to