Wie kann man die Leistung einer massiven Baumansicht verbessern?

7

Zunächst beantworte ich meine Frage Q / A-Stil, also brauche ich nicht unbedingt jemanden, der das beantwortet. Es ist etwas, was ich gelernt habe und viele können davon Gebrauch machen.

Ich habe eine Baumansicht, die aus vielen verschiedenen Knoten besteht. Jeder Knoten hat in seiner Eigenschaft Data ein Objekt dahinter, und die Objekte beziehen sich auf verschiedene Hierarchieebenen einer Hauptliste von Objekten, die ziemlich groß ist (viele tausend Elemente). Ein Knoten stellt eine bestimmte Eigenschaft für dieses aufgelistete Hauptobjekt dar, wobei der Baum es dem Benutzer ermöglicht, einen Knoten auszuwählen, um die Elemente anzuzeigen, die zu dieser bestimmten ausgewählten Kategorie gehören.

Wenn der Baum gefüllt wird, wird es extrem zeitaufwendig (in einigen Fällen 2 Minuten), da jeder Knoten jedes Element in dieser großen Liste durchlaufen muss und jedes Element in dieser Liste finden muss, das unter einen bestimmten Knoten fällt. Wenn in diesem Baum also 500 Knoten vorhanden sind, durchläuft es 500 Mal diese große Liste. Es gibt insgesamt 3 Hierarchieebenen - die Performance-Drossel tritt beim Laden der zweiten und dritten Ebene auf, aber die erste Ebene ist einfach und schnell.

Jetzt gibt es keine Optionen mehr, um die Leistung beim hunderten von Iterationen durch diese Liste zu verbessern. Was ich mich wundere, ist, gibt es irgendwelche Tricks, um die Leistung des Auffüllens der Baumansicht zu verbessern?

So funktioniert es derzeit:

%Vor%

Und eine ähnliche Methode für jede weitere Ebene.

PS - Die erste Hierarchieebene wird aus einer separaten eigenen Liste (etwa 50 Objekte) gefüllt, während die zweite und dritte Ebene aus den Eigenschaften dieser vielen tausend Objekte in einer Hauptliste gefüllt werden. Deshalb lädt die erste Ebene schnell, und der Rest ist langsam.

    
Jerry Dodge 13.11.2013, 01:26
quelle

2 Antworten

4

In Baumansichten gibt es einen häufigen Trick, um die Leistung in dieser Art von Situation zu verbessern. Wenn Sie diese Baumansicht aktualisieren, laden Sie nur die erste Hierarchiestufe und sorgen Sie sich nicht um weitere Ebenen. Stattdessen können Sie jede zusätzliche Ebene zum Zeitpunkt der Erweiterung jedes Knotens laden. Hier ist, wie es geht.

Wenn Sie die erste Ebene auffüllen und nicht jeden der untergeordneten Knoten laden, erstellen Sie stattdessen einfach einen "fiktiven" untergeordneten Knoten mit einem nil -Zeiger in der Eigenschaft Data - da jeder Knoten erwartet wird ein Objekt in der Eigenschaft Data sowieso. Überwachen Sie dann das OnExpanding -Ereignis der Strukturansicht. Wenn ein Knoten erweitert wird, prüft er, ob dieser "Dummy" -Kindknoten existiert oder nicht. Wenn ja, dann weiß es, dass es die Kindknoten laden muss.

Wenn die erste Hierarchieebene geladen wird ...

%Vor%

Erstellen Sie dann einen Event-Handler für OnExpanding ...

%Vor%

Der einzige Nachteil dieses Tricks besteht darin, dass für alle Knoten, die noch nicht expandiert wurden, ein + neben ihnen liegt, auch wenn keine untergeordneten Knoten vorhanden sind. Wenn dies der Fall ist, wenn der Benutzer auf + klickt, um einen Knoten zu erweitern, wird der untergeordnete Knoten gelöscht, und + verschwindet, sodass der Benutzer weiß, dass sich keine untergeordneten Knoten in diesem Knoten befinden.

Auch die Verwendung von BeginUpdate und EndUpdate in TreeView.Items verbessert die Leistung, da keine GUI-Aktualisierungen durchgeführt werden, bis alles fertig ist ...

%Vor%     
Jerry Dodge 13.11.2013, 01:26
quelle
15

Wenn Sie wirklich daran interessiert sind, eine massive Baumansicht zu füllen, sollten Sie in virtualTreeView ( Ссылка ) nachsehen. .
Es ist eine Open-Source-Treeview, die speziell dafür entwickelt wurde, virtuell zu sein und Geschwindigkeit / Speicher für große Baumansichten zu maximieren.
Es ist eine erstaunliche Komponente.

    
Dave Novo 13.11.2013 04:48
quelle