After using SALT 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
