#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 является его основной целью.
Приветствую, Шон