Производительность с XML и ListView - PullRequest
1 голос
/ 29 октября 2009

У меня одна проблема с производительностью в 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 секунд и он слишком длинный. Есть ли способы улучшить производительность такой операции? Я пытался использовать CTP-версию Microsoft Parallel Extensions за июль 2008 года, но это ничего не улучшило, возможно, потому что эту операцию нельзя разделить на 2 отдельных потока. И где самая большая проблема с производительностью в этом коде?

Ответы [ 2 ]

2 голосов
/ 29 октября 2009

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

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

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

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

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

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

0 голосов
/ 29 октября 2009

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

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

Ура, Шон

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