我有一个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个独立的线程。这段代码中最大的性能问题在哪里?
答案 0 :(得分:2)
我强烈怀疑XML不是代码的缓慢部分。注释掉MyListView.Items.Add
行,我怀疑你的XMLNode
循环将在不到一秒的时间内执行。
对于中型计算机上的.NET ListView
,每秒构建1000行是对性能的合理估计。这几乎完全符合您的代码性能。您可以尝试一些技巧,使其速度提高10-20%,但为了使其更多更快,您将不得不使用虚拟ListView
。
我有程序LyricsFetcher,它读取iTunes资料库XML文件并构建一个歌曲列表(看起来与你正在做的类似)。该程序使用来自ObjectListView的FastObjectListView
(.NET WinForms ListView的开源包装器)。该程序在不到1秒的时间内加载并显示5000首歌曲 - 我猜这是你正在寻找的那种性能。
如果您不想搞乱虚拟列表视图,这些是列表视图的一些性能技巧:
BeginUpdate()
/ EndUpdate()
对ListViewItemSorter
ListViewItems
数组,然后使用listView.Items.AddRange()
但使用虚拟列表确实是显着提高性能的唯一方法。
答案 1 :(得分:0)
注意到您没有使用XmlTextReader
?
可能值得检查一下。不知道它是否会更快,但值得一看,因为阅读XML是它的主要目的。
干杯,肖恩