Condividi tramite


How to traverse xmlelement.childnodes effectively

I have been working on the performance these days, and I want to share some tricks that you can do to reduce memory allocation significantly if the xml document you are working with is huge.

Use XmlElement.FirstChild and next sidbling is a lot cheaper than foreach(xmlnode child in element.ChildNodes).  You can run the CLRProfiler to see the difference.

         // index approach -- bad 
        static int Approach1(XmlNode element)
        {
            int count = 1;

            for ( int index = 0; index < element.ChildNodes.Count; index++ )
            {
                XmlElement child = element.ChildNodes[index] as XmlElement;

                if ( child != null )
                    count += Approach1(child);
            }

            return count;
        }

        // foreach approach: -- bad
        static int Approach2(XmlNode element)
        {
            int count = 1;

            foreach ( XmlNode node in element.ChildNodes )
            {
                if ( node is XmlElement )
                {
                    count += Approach2(node);
                }
            }

            return count;
        }

        // first child + sibling approach -- good
        static int Approach3(XmlNode element)
        {
            int count = 1;

            XmlNode child = element.FirstChild;

            while( child != null && child is XmlElement)
            {
                count += Approach3(child);
                child = child.NextSibling;               
            }           

            return count;
        }

Hope this helps!