使用XML和ListView实现性能

时间:2009-10-29 09:48:28

标签: xml performance listview

我有一个XML和ListView的性能问题:

我有大约12000个节点的XML文件(是的,它非常多,但所有节点都是必需的)。该文件具有以下结构:

<?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 2008年7月的CTP,但它没有任何改动,可能因为此操作无法拆分为2个独立的线程。这段代码中最大的性能问题在哪里?

2 个答案:

答案 0 :(得分:2)

我强烈怀疑XML不是代码的缓慢部分。注释掉MyListView.Items.Add行,我怀疑你的XMLNode循环将在不到一秒的时间内执行。

对于中型计算机上的.NET ListView,每秒构建1000行是对性能的合理估计。这几乎完全符合您的代码性能。您可以尝试一些技巧,使其速度提高10-20%,但为了使其更多更快,您将不得不使用虚拟ListView

我有程序LyricsFetcher,它读取iTunes资料库XML文件并构建一个歌曲列表(看起来与你正在做的类似)。该程序使用来自ObjectListViewFastObjectListView(.NET WinForms ListView的开源包装器)。该程序在不到1秒的时间内加载并显示5000首歌曲 - 我猜这是你正在寻找的那种性能。

如果您不想搞乱虚拟列表视图,这些是列表视图的一些性能技巧:

  • 收录BeginUpdate() / EndUpdate()
  • 之间的所有更新
  • 请务必在插入新行之前清除ListViewItemSorter
  • 构建一个ListViewItems数组,然后使用listView.Items.AddRange()
  • 一次性添加它们

但使用虚拟列表确实是显着提高性能的唯一方法。

答案 1 :(得分:0)

注意到您没有使用XmlTextReader

可能值得检查一下。不知道它是否会更快,但值得一看,因为阅读XML是它的主要目的。

干杯,肖恩