Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xml树自底向上算法,性能:XmlTextReader与XDocument_C#_Xml_Performance - Fatal编程技术网

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

C# Xml树自底向上算法,性能:XmlTextReader与XDocument,c#,xml,performance,C#,Xml,Performance,我知道XmlTextReader比使用XDocument读取XML文件快得多,但在读取XmlTextReader时,我需要以任何方式生成树对象,因为我需要在树上执行一个算法,该算法要求节点按按钮向上排序 性能对于这个脚本来说是至关重要的,所以我想知道使用XmlTextReader生成自己的树,然后使用XDocument(我想这是高度优化的)会更快吗。内存不是问题,唯一的问题是运行时。我做了一个小测试以查看差异,在我的测试中,我生成了一个随机深度的随机XML树,然后测试“简单地逐行读取文件”、XD

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


性能对于这个脚本来说是至关重要的,所以我想知道使用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;
    }
}
类程序
{
静态void Main(字符串[]参数)
{
对于(int i=1;i 0)
{
maxNodes-=writeXml(outfile、rand、maxNodes);
}
outfile.Write(“\n”);
}
WriteLine(“随机树生成时间:”+(DateTime.Now-start));
尝试
{
start=DateTime.Now;
//读取文件并逐行显示。
使用(System.IO.StreamReader文件=新的System.IO.StreamReader(路径))
{
while(file.ReadLine()!=null)
{
}
}
WriteLine(“基本读取(“+nodeSize+”节点):”+(DateTime.Now-start));
}
抓住
{
Console.WriteLine(“基本读取在“+nodeSize+”节点失败”);
}
尝试
{
start=DateTime.Now;
var xd=System.Xml.Linq.XDocument.Load(路径);
WriteLine(“XDocument(“+nodeSize+”节点):”+(DateTime.Now-start));
}
抓住
{
WriteLine(“System.Xml.Linq.XDocument在“+nodeSize+”节点失败”);
}
尝试
{
start=DateTime.Now;
XmlTextReader=新的XmlTextReader(路径);
XmlDocument doc=新的XmlDocument();
文件加载(读卡器);
reader.Close();
WriteLine(“XmlDocument”(“+nodeSize+”节点):“+(DateTime.Now-start));
}
抓住
{
WriteLine(“XmlDocument在“+nodeSize+”节点失败”);
}
}
Console.ReadLine();
}
静态int writeXml(StreamWriter输出文件、随机rand、int maxNode)
{
int mymax=(int)Math.天花(maxNode*rand.NextDouble());
int count=mymax;
while(mymax>0)
{
string node=“node”+((int)Math.天花(15*rand.NextDouble());
outfile.Write(“\n”);
如果(rand.NextDouble()>0.5&&mymax>1)//有节点吗?
{
mymax-=writeXml(outfile,rand,mymax);
}
否则就有价值了
{
outfile.Write(“数据随机数据”+rand.Next());
}
输出文件。写(“”);
mymax--;
}
返回计数;
}
}