2009-10-29 3 views
1

i ont un problème de performance avec XML et ListView:Performance avec XML et ListView

i ont un fichier XML avec environ 12000 noeuds (oui, il est très bien, mais tous les nœuds sont nécessaires). Ce fichier a la structure suivante:

<?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> 

et je besoin de charger ce document dans 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); 
} 

Ce processus prend environ 10 secondes et il est trop long. Existe-t-il des moyens d'améliorer les performances d'une telle opération? J'ai essayé d'utiliser Microsoft Parallel Extensions Juillet 2008 CTP, mais cela n'a rien changé, peut-être parce que cette opération ne peut pas être divisée en 2 threads séparés. Et où est la plus grande question de performance dans ce code?

+0

essayez d'éviter foreach, utilisez pendant que ou pour – eugeneK

Répondre

2

Je voudrais fort suspect que le XML n'est pas la partie lente du code. Commentez la ligne MyListView.Items.Add et je suspecte que votre boucle XMLNode s'exécutera en moins d'une seconde.

Pour .NET ListView sur une machine de milieu de gamme, la construction de 1000 lignes par seconde est une estimation raisonnable de la performance. Cela correspond presque parfaitement à la performance de votre code. Vous pouvez essayer quelques astuces pour faire 10-20% plus rapide, mais pour le rendre beaucoup plus rapide, vous devez utiliser un ListView virtuel.

J'ai programme LyricsFetcher qui lit le fichier XML de la bibliothèque iTunes et construit une liste de chansons (qui ressemble à ce que vous faites). Ce programme utilise le FastObjectListView de ObjectListView (un wrapper open source autour de .NET WinForms ListView). Ce programme charge et affiche 5 000 chansons en moins d'une seconde - ce que je suppose être le genre de performance que vous recherchez.

Si vous ne voulez pas gâcher avec un listview virtuel, ce sont des trucs de performance avec un listview:

  • Support toutes les mises à jour entre un BeginUpdate()/EndUpdate() paire
  • Rappelez-vous d'effacer ListViewItemSorter avant d'insérer nouvelles lignes
  • Construire un tableau de ListViewItems puis les ajouter à la fois avec listView.Items.AddRange()

Mais l'utilisation d'une liste virtuelle est vraiment le seul moyen d'améliorer significativement les performances.

0

Vous avez remarqué que vous n'utilisez pas un XmlTextReader?

Cela peut valoir la peine d'être vérifié. Je ne sais pas si ça va être plus rapide, mais ça vaut le coup vu que la lecture de XML est son but principal.

Cheers, Sean