如何优化XML编写方法?

时间:2011-09-16 13:46:06

标签: c# .net xml performance optimization

我只能使用.NET 2.0框架来创建XML文档(> 1000行)。

从Windows注册表中检索文档的信息。 XML是使用2 for循环编写的,在这些循环中我调用3 .ToString()方法来转换检索到的数据。

正如预期的那样,创建XML文档需要很长时间。我想知道如何优化这一点。

public static void InitiateApp()
{
    const string regadd = "SOFTWARE" + "\\" +  "\\" + "Microsoft" + "\\" + "Windows NT" + "\\" +  "CurrentVersion" + "\\Fonts";
    RegistryKey regkey = Registry.LocalMachine.OpenSubKey(regadd);
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.CloseOutput = true;
    settings.Indent = true;
    settings.IndentChars = "\t";
    settings.NewLineChars = "\r\n";
    settings.NewLineOnAttributes = true;
    settings.OmitXmlDeclaration = true;
    XmlWriter w = XmlWriter.Create("c:\\out.xml",settings);
    foreach (FontFamily font in FontFamily.Families)
    {
        w.WriteStartElement("FontFamily");
        int keyCount = 0;
        foreach (string key in regkey.GetValueNames())
        {   
            if(regkey.GetValueNames()[keyCount].ToString().Contains(font.Name)) 
            {
                         w.WriteStartElement("FontName",regkey.GetValueNames()[keyCount].ToString());
                         w.WriteElementString("FontFile",regkey.GetValue(key).ToString());
             w.WriteEndElement();
            }
            keyCount++;
        }
        w.WriteEndElement();
    }
    w.Flush();
}

4 个答案:

答案 0 :(得分:2)

将多个调用移出GetValueNames,然后初始化字符串数组。这至少会有一些小改进。

string[] vals = regkey.GetValueNames();
XmlWriter w = XmlWriter.Create("c:\\out.xml",settings); 
foreach (Xtype a in all_a) 
{
    w.WriteStartElement("newElement");     
    int keyCount = 0;     
    foreach (YType b in all_b)     
    {            
         if(vals[keyCount].ToString().Contains(a.name))          
         {
             w.WriteStartElement("a_name",vals[keyCount].ToString());                  
             w.WriteElementString("b_name",regkey.GetValue(key).ToString());             
             w.WriteEndElement();
          }

答案 1 :(得分:1)

也许使用linq to xml来编写文档。就个人而言,我觉得这是一种更直接的方法。

答案 2 :(得分:1)

我的猜测是,从注册表中检索数据的时间比序列化要长。 您可以做的是使用生产者消费者模式来多线程从注册表中检索密钥(不确定这会有所帮助)......然后使用单个消费者将其写出来。

请参阅Blocking Collection and the Producer-Consumer Problem

答案 3 :(得分:1)

将注册表访问与xml写入分开。然后你可以衡量每一个,看看哪个很慢。


regkey.GetValueNames()[keyCount].ToString()

GetValueNames返回一个字符串[],为什么要调用ToString?

foreach (string key in regkey.GetValueNames()) 
//...
if(regkey.GetValueNames()[keyCount].ToString().Contains(font.Name)) 
//...
w.WriteStartElement("FontName",regkey.GetValueNames()[keyCount].ToString()); 

为什么这么多地调用GetValueNames?