Xml Tree Bottom Up算法,性能:XmlTextReader与XDocument

时间:2014-03-21 12:18:09

标签: c# xml performance

我知道XmlTextReader比使用XDocument读取XML文件快得多,但是在读取XmlTextReader时我需要以任何方式生成树对象,因为我需要在需要节点的树上执行算法按钮按顺序排序。

性能对于这个脚本至关重要,所以我想知道使用XmlTextReader并生成我自己的树,然后使用XDocument,我认为它仍然更快,我猜这是高度优化的。内存不是问题,唯一的问题是运行时。

1 个答案:

答案 0 :(得分:0)

我做了一个小测试来看看差异,在我的测试中我生成一个随机深度的随机XML树,然后测试"只是逐行读取文件的时间",XDocument和XmlDocument以下是结果。请注意,数据应该带有一克盐,因为后台程序可能在一个点上花费了更多的CPU时间然后另一个但我试图将其最小化。

Generating XML file of size 100000 nodes.
Random Tree Generate time: 00:00:00.1450100
Basic read (100000 nodes): 00:00:00.0340026
XDocument (100000 nodes): 00:00:00.0970074
XmlDocument (100000 nodes): 00:00:00.1310083


Generating XML file of size 200000 nodes.
Random Tree Generate time: 00:00:00.2800201
Basic read (200000 nodes): 00:00:00.0720057
XDocument (200000 nodes): 00:00:00.2140145
XmlDocument (200000 nodes): 00:00:00.3780260


Generating XML file of size 300000 nodes.
Random Tree Generate time: 00:00:00.4320307
Basic read (300000 nodes): 00:00:00.1170083
XDocument (300000 nodes): 00:00:00.3940275
XmlDocument (300000 nodes): 00:00:00.6610466


Generating XML file of size 400000 nodes.
Random Tree Generate time: 00:00:00.4920347
Basic read (400000 nodes): 00:00:00.1280360
XDocument (400000 nodes): 00:00:00.5806501
XmlDocument (400000 nodes): 00:00:00.5740402


Generating XML file of size 1000000 nodes.
Random Tree Generate time: 00:00:01.2270864
Basic read (1000000 nodes): 00:00:00.2940205
XDocument (1000000 nodes): 00:00:01.5451096
XmlDocument (1000000 nodes): 00:00:02.0201415


Generating XML file of size 2000000 nodes.
Random Tree Generate time: 00:00:02.5251779
Basic read (2000000 nodes): 00:00:00.6170434
XDocument (2000000 nodes): 00:00:03.4573680
XmlDocument (2000000 nodes): 00:00:03.3052323


Generating XML file of size 3000000 nodes.
Random Tree Generate time: 00:00:03.5962528
Basic read (3000000 nodes): 00:00:00.9170651
XDocument (3000000 nodes): 00:00:05.1344993
XmlDocument (3000000 nodes): 00:00:05.4273814


Generating XML file of size 4000000 nodes.
Random Tree Generate time: 00:00:04.4403129
Basic read (4000000 nodes): 00:00:01.3062051
XDocument (4000000 nodes): 00:00:07.0914985
XmlDocument (4000000 nodes): 00:00:07.1036703


Generating XML file of size 5000000 nodes.
Random Tree Generate time: 00:00:05.6483977
Basic read (5000000 nodes): 00:00:01.6771169
XDocument (5000000 nodes): 00:00:09.0457656
XmlDocument (5000000 nodes): 00:00:08.9917587


Generating XML file of size 6000000 nodes.
Random Tree Generate time: 00:00:07.2595102
Basic read (6000000 nodes): 00:00:01.9852661
XDocument (6000000 nodes): 00:00:10.6767517
XmlDocument (6000000 nodes): 00:00:12.0809750


Generating XML file of size 7000000 nodes.
Random Tree Generate time: 00:00:07.5056502
Basic read (7000000 nodes): 00:00:02.3651666
System.Xml.Linq.XDocument failed at 7000000 nodes
XmlDocument (7000000 nodes): 00:00:12.8675950


Generating XML file of size 8000000 nodes.
Random Tree Generate time: 00:00:09.0982253
Basic read (8000000 nodes): 00:00:02.6701876
System.Xml.Linq.XDocument failed at 8000000 nodes
XmlDocument (8000000 nodes): 00:00:16.7583049


Generating XML file of size 9000000 nodes.
Random Tree Generate time: 00:00:10.0358261
Basic read (9000000 nodes): 00:00:03.0752163
System.Xml.Linq.XDocument failed at 9000000 nodes
XmlDocument (9000000 nodes): 00:00:17.4173450


Generating XML file of size 10000000 nodes.
Random Tree Generate time: 00:00:10.9155418
Basic read (10000000 nodes): 00:00:03.8667958
System.Xml.Linq.XDocument failed at 10000000 nodes
XmlDocument (10000000 nodes): 00:00:18.1173983

这是我的测试代码

class Program
{
    static void Main(string[] args)
    {

        for (int i = 1; i <= 15; i++)
        {

            int nodeSize;
            if (i < 5)
            {
                nodeSize = 100000*i;
            }
            else
            {
                nodeSize = 1000000 * (i-4);
            }
                Console.WriteLine("\n\nGenerating XML file of size " + nodeSize + " nodes.");
                DateTime start = DateTime.Now;
                Random rand = new Random();
                string path = @"C:\Users\b-kass\Documents\Projects\XmlDiff\Large.xml";
                using (StreamWriter outfile = new StreamWriter(path, false))
                {
                    outfile.Write("<root>\n");
                    int maxNodes = nodeSize;
                    while (maxNodes > 0)
                    {
                        maxNodes -= writeXml(outfile, rand, maxNodes);
                    }
                    outfile.Write("</root>\n");
                }
                Console.WriteLine("Random Tree Generate time: " + (DateTime.Now - start));

            try
            {
                start = DateTime.Now;
                // Read the file and display it line by line.
                using (System.IO.StreamReader file = new System.IO.StreamReader(path))
                {
                    while (file.ReadLine() != null)
                    {
                    }
                }
                Console.WriteLine("Basic read (" + nodeSize + " nodes): " + (DateTime.Now - start));

            }
            catch
            {
                Console.WriteLine("Basic read failed at " + nodeSize + " nodes");
            }

                try
                {
                    start = DateTime.Now;
                    var xd = System.Xml.Linq.XDocument.Load(path);
                    Console.WriteLine("XDocument (" + nodeSize + " nodes): " + (DateTime.Now - start));
                }
                catch
                {
                    Console.WriteLine("System.Xml.Linq.XDocument failed at " + nodeSize + " nodes");
                }


                try
                {
                    start = DateTime.Now;
                    XmlTextReader reader = new XmlTextReader(path);
                    XmlDocument doc = new XmlDocument();
                    doc.Load(reader);
                    reader.Close();
                    Console.WriteLine("XmlDocument (" + nodeSize + " nodes): " + (DateTime.Now - start));
                }
                catch
                {
                    Console.WriteLine("XmlDocument failed at " + nodeSize + " nodes");
                }

        }
        Console.ReadLine();
    }

    static int writeXml(StreamWriter outfile, Random rand, int maxNode)
    {
        int mymax = (int)Math.Ceiling(maxNode * rand.NextDouble());
        int count = mymax;
        while (mymax > 0)
        {
            string node = "node" + ((int) Math.Ceiling(15*rand.NextDouble()));
            outfile.Write("\n<" + node + ">");
            if (rand.NextDouble() > 0.5 && mymax > 1) // Have nodes?
            {
                mymax -= writeXml(outfile, rand, mymax);
            }
            else // have value
            {
                outfile.Write("Data random data " + rand.Next());
            }
            outfile.Write("</" + node + ">");
            mymax--;
        }
        return count;
    }
}