Warum ist das Sortieren mit CollectionViewSource.SortDescriptions langsam?

8

Dies ist die Standard-Sortiermethode, wenn Sie auf eine Spaltenüberschrift in DataGrid klicken. Wenn die zugrunde liegende Liste 100.000 Elemente enthält, dauert es etwa 20 Sekunden, um die Ansicht zu aktualisieren. Die gleiche Verzögerung kann beobachtet werden, wenn SortDescription s auf CollectionView gesetzt wird.

Durch die Verwendung von ListCollectionView.CustomSort oder durch Sortieren und erneutes Assemblieren funktioniert die Liste fast sofort.

Warum ist diese Verzögerung? Ist das nur eine "Reflektionssteuer" für die gebundenen Eigenschaften?

    
Sergey Aldoukhov 27.10.2009, 21:12
quelle

2 Antworten

9

Sie haben recht, das ist eine Steuer auf die Reflexion. Ich habe die Leistung von DataGrid schon vor einiger Zeit sehr genau beobachtet, und Reflektion war hier ein Flaschenhals. Unabhängig davon, wie schnell der Sortieralgorithmus ist, wird der Wert der Eigenschaft zwischen zwei Vergleichen nicht zwischengespeichert. Selbst wenn Sie also n * ln (n) Vergleiche haben, erhalten Sie mit n == 100 000 ~ 1 000 000 Operationen. Jeder Operand verwendet Reflektion, um Wert zu erhalten, also haben Sie 2 000 000 Aufrufe zur Reflektion in Steuer :) ... ListCollectionView.CustomSort ist hier die ideale Lösung.

PS: Am Ende des Tages haben wir ein ListView-basiertes Gitter geschrieben, weil wir mit der Renderleistung des DataGrid nicht zufrieden waren ... Aber das ist eine andere Geschichte:)

    
Anvaka 27.10.2009, 21:41
quelle
1

Die beste Leistungsoptimierung zum Filtern war das Umschalten von DataGridRow Visibility. Es machte Größe des Unterschieds!

1. Fügen Sie die IsVisible-Eigenschaft dem Collection Item hinzu, an das Sie die ItemSource des DataGrids binden.

%Vor%

2.Trigger die Sichtbarkeit von DataGridRow durch Bindung an Ihre IsVisible-Eigenschaft:

%Vor%

3. Nun, du musst das IsVisible irgendwo einstellen, denke ich auch, wie in deinem ViewModel. Hier ist nur ein Beispiel von dem, was ich mache (einfach kopieren / einfügen Job) - im Grunde setzen IsVisible zu wahr oder falsch basierend auf einigen Kriterien in meinem anderen ViewModel:

%Vor%     
denis morozov 15.03.2012 18:38
quelle