High CPU usage for .NET 1.1 XSL transformation


 


In .NET 1.1, XSL transformation with System.Xml.XmlDataDocument may run very slowly and the CPU usage may reach 100% if you transform large data.


Repro Code


1.    XSL file


<?xml version="1.0" encoding="ISO-8859-1"?>


 


<xsl:stylesheet version="1.0"


xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


 


<xsl:template match="/">


  <html>


  <body>


  <h2>My CD Collection</h2>


  <table border="1">


    <tr bgcolor="#9acd32">


      <th>Title</th>


    </tr>


    <xsl:for-each select="root/element">


    <tr>


      <td><xsl:value-of select="value"/></td>


    </tr>


    </xsl:for-each>


  </table>


  </body>


  </html>


</xsl:template>


 


</xsl:stylesheet>


 


2.    C# source code


                System.Xml.XmlDataDocument doc = new XmlDataDocument();


                doc.LoadXml("<root><element/></root>");


                XmlElement root = doc.DocumentElement;


                XmlElement e = null;


                for(int i = 0; i < 100000; i ++)


                {


                     e = doc.CreateElement("element");


                     e.InnerXml = "<value>"  + i + "</value>";


                     root.AppendChild(e);


                }


 


                XslTransform transform = new XslTransform();


          


                transform.Load("file://c:\\xsl.txt");


                StringWriter writer = new StringWriter();


                System.Threading.Thread.Sleep(10000);


                transform.Transform(doc, null, writer, null);


 


                //Console.Write(writer.ToString());


                System.Threading.Thread.Sleep(10000);


                Console.Write("finish");


 


Symptom


If we replace the System.Xml.XmlDataDocument with System.Xml.XmlDocument, the performance is improved significantly. The following two pictures are the CPU usage for the application with the above two classes.



xmldatadocument.jpg


We can see the peak CPU usage is 100%, the XmlDataDocument will keep consuming CPU while the XmlDocument will only reach one peak. 


Root Cause


This behavior is by design. The XmlDataDocument class is primarily designed for synchronizing XML with DataSet.


Solution


There are 2 options to resolve this issue:


1.    Run XSL transformations by using the XmlDocument or XPathDocument classes instead of XmlDataDocument


2.    Upgrade to .NET 2.0 or higher and use XslCompiledTransform Class. Please note, although the performance has improved a lot for XmlDataDocument in .NET 2.0, it is still much slower than XmlDocument or XPathDocument


References


Performance of XSLT Transformations in the .NET Framework:


http://support.microsoft.com/kb/325689


Using the XslCompiledTransform Class:


http://msdn.microsoft.com/en-us/library/0610k0w4.aspx


 


Best Regards,


 


Zhixing Lv


 

Comments (0)

Skip to main content