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]
