Xml树自底向上算法,性能:XmlTextReader与XDocument

本文关键字:XmlTextReader XDocument 性能 自底向上 算法 Xml | 更新日期: 2023-09-27 17:51:21

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

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

Xml树自底向上算法,性能:XmlTextReader与XDocument

我做了一个小测试来看看差异,在我的测试中,我生成一个随机深度的随机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;
    }
}