Как оптимизировать метод записи XML? - PullRequest
2 голосов
/ 16 сентября 2011

Я могу использовать только платформу .NET 2.0 для создания XML-документа (> 1000 строк).

Информация для документа извлекается из реестра Windows.XML записывается с использованием 2 для циклов, и в этих циклах я вызываю 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 ]

2 голосов
/ 16 сентября 2011

Переместите несколько вызовов на 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 голос
/ 16 сентября 2011

Отделить доступ к реестру от записи 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?

1 голос
/ 16 сентября 2011

Я предполагаю, что получение данных из реестра занимает больше времени, чем ваша сериализация.То, что вы могли бы сделать, это использовать шаблон потребителя производителя для многопоточности извлечения ключей из реестра (не уверен, что это поможет) ... а затем использовать одного потребителя для их записи.

См. Блокирующий сбор и проблема производителя-потребителя

1 голос
/ 16 сентября 2011

Возможно, используйте linq to xml для написания документа. Лично я чувствую, что это более простой метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...