#c# #xml
#c# #xml
Вопрос:
В моем приложении я должен создать элемент XML, в который мне нужно вставить это значение, после некоторой проверки (поэтому я должен его преобразовать)
int currentXMLTimeValue = Convert.ToInt32(elemList[i].Attributes["tTime"].Value);
При отладке я застреваю на этой строке и могу ждать более 10 минут, и я получаю исключение тайм-аута. Как вы могли догадаться, я запускаю его через цикл, поэтому очень важно, что я не трачу так много времени на действие.
мое другое преобразование совсем не медленное
int currentEDFTimeValue = Convert.ToInt32(lines[j][2]);
Тогда это должен быть вызов значения, который использует время, как я мог бы иначе получить это значение или как я могу ускорить это?
elemList[i].Attributes["tTime"].Value
Вот остальные циклы for
XmlWriter writer = null;
XmlDocument doc = new XmlDocument();
doc.Load(oldFile);
XmlNodeList elemList = doc.GetElementsByTagName("test");
for (int j = 0; j < lines.Length; j )
{
int currentEDFTimeValue = Convert.ToInt32(lines[j][2]);
for (int i = 0; i < elemList.Count; i )
{
XmlElement newElem = doc.CreateElement(replacementElement);
int currentXMLTimeValue = Int32.Parse(elemList[i].Attributes["tTime"].Value);
if (currentEDFTimeValue != currentXMLTimeValue)
{
newElem.SetAttribute("tTime", currentEDFTimeValue.ToString());
if (currentEDFTimeValue > currentXMLTimeValue)
{
eventNode.InsertAfter(newElem, elemList[i]);
}
else if (currentEDFTimeValue < currentXMLTimeValue)
{
eventNode.InsertBefore(newElem, elemList[i]);
}
}
}
}
Эти XML-файлы могут содержать более 50 000 строк
Редактировать:
Некоторые тесты показали, что это очень быстро
var test = elemList;
Но получение конкретного узла xml происходит очень медленно
var test = elemList[i];
Может быть, это потому, что я добавляю узлы / элементы в список во время его использования?
ПРАВКА2:
У меня есть другая функция, которая более или менее такая же, но она также очень быстрая
List<List<int>> offsets = new List<List<int>>();
for (int i = 0; i < elemList.Count; i )
{
var xmlDur = Convert.ToInt32(elemList[i].Attributes["duration"].Value);
List<int> offset = new List<int>();
for (int j = 0; j < lines.Length; j )
{
var edfDur = Convert.ToInt32(lines[j][4]);
if (Math.Abs(edfDur - xmlDur) <= 2)
{
for (int h = 0; h < offsets[offsets.Count - 2].Count; h )
{
startTimeDistance = Convert.ToInt32(elemList[i].Attributes["tTime"].Value) - Convert.ToInt32(lines[j][3]);
offset.Add(startTimeDistance);
}
}
}
if(offset.Count > 0) offsets.Add(offset);
}
Комментарии:
1.
Int32.Parse
немного быстрее, но что заставляет вас думатьConvert
, что функция является узким местом?2. Он не
Convert.ToInt32
работает медленно. Отредактируйте свой пост с кратким кодом, который воспроизводит проблему, и мы сможем помочь.3. Сколько элементов вы обрабатываете? Насколько дорог только
elemList[i].Attributes["tTime"].Value
вызов?4. Я думаю, что коллекция ‘Attributes’ ищет все дочерние узлы для атрибута «tTime», что, вероятно, заставляет его работать так долго.
5. Какова среда? Это веб-приложение, Asp.net , или строго на базе ПК? (10 минут звучит так, как будто должны быть задействованы какие-то сетевые коммуникации.)