Производительность с XML и ListView

#xml #performance #listview

#xml #Производительность #listview

Вопрос:

у меня есть одна проблема с производительностью с XML и ListView:

у меня есть XML-файл примерно с 12000 узлами (да, это очень много, но необходимы все узлы). Этот файл имеет следующую структуру:

 <?xml .... ?>
<MyRootNode>
<node name="name1" lang="en" artist="aaa" genre="dsdsds" dsadasd="dsdsd" />
...
<node name="name12000" lang="en" artist="aaa" genre="dsdsds" dsadasd="dsdsd" />
</MyRootNode>
  

и затем мне нужно загрузить этот документ в ListView:

 XmlDocument Doc = new XmlDocument();
Doc.Load("MyDoc.xml");

string[] SubItems = new string[4];
foreach(XmlNode Node in Doc.DocumentElement.ChildNodes) 
{
SubItems[0] = Node.Attributes["lang"].Value;
SubItems[1] = Node.Attributes["artist"].Value;
SubItems[2] = Node.Attributes["genre"].Value;
SubItems[3] = Node.Attributes["dsadasd"].Value
MyListView.Items.Add(Node.Attributes["Name"].Value).SubItems.Add(SubItems);
}
  

Этот процесс занимает около 10 секунд и является слишком долгим. Существуют ли какие-либо способы повысить производительность такой операции? Я пытался использовать Microsoft Parallel Extensions July 2008 CTP, но это ничего не изменило, возможно, потому, что эта операция не может быть разделена на 2 отдельных потока. И где самая большая проблема с производительностью в этом коде?

Комментарии:

1. старайтесь избегать foreach, используйте while или for вместо

Ответ №1:

Я бы сильно подозревал, что XML не является самой медленной частью кода. Закомментируйте MyListView.Items.Add строку, и я подозреваю, что ваш XMLNode цикл выполнится менее чем за одну секунду.

Для .NET ListView на компьютере среднего уровня построение 1000 строк в секунду является разумной оценкой производительности. Это почти идеально соответствует производительности вашего кода. Вы можете попробовать пару трюков, чтобы ускорить его на 10-20%, но чтобы сделать это намного быстрее, вам придется использовать виртуальный ListView .

У меня есть программа LyricsFetcher, которая считывает XML-файл библиотеки iTunes и создает список песен (который выглядит аналогично тому, что вы делаете). Эта программа использует FastObjectListView из ObjectListView (оболочка с открытым исходным кодом для .NET WinForms ListView). Эта программа загружает и отображает 5000 песен менее чем за 1 секунду — я полагаю, это та производительность, которую вы ищете.

Если вы не хотите возиться с виртуальным listview, вот несколько приемов повышения производительности с помощью listview:

  • Заключайте в скобки все обновления между BeginUpdate() / EndUpdate() парой
  • Не забудьте очистить ListViewItemSorter перед вставкой новых строк
  • Создайте массив ListViewItems , а затем добавьте их все сразу с помощью listView.Items.AddRange()

Но использование виртуального списка — действительно единственный способ значительно повысить производительность.

Ответ №2:

Заметили, что вы не используете XmlTextReader ?

Возможно, стоит это проверить. Не знаю, будет ли это быстрее, но попробовать стоит, поскольку чтение XML является его основной целью.

Приветствую, Шон