【发布时间】:2010-07-22 02:33:58
【问题描述】:
我需要在以相当高的频率添加的网格中显示大量行(在某些情况下最多每秒 10 行) 我选择 ListView 是因为我认为它是 WPF 中最快的网格控件。 (肯定比 GridView 快很多)
在添加了几十万个项目之后,CPU 利用率变得相当高,并且它们继续进入。这相当令人惊讶,因为 ListView 只呈现可见行,因此总共添加了多少行并不重要。
我的第一个方法是将它绑定到 ObservableCollection,但过了一段时间,CPU 利用率上升,整个窗口变得紧张。
我尝试将它绑定到一个常规列表,这似乎更快,但是我确实需要经常调用列表上的 .Refresh() ,这在一段时间后也会猛烈抨击 CPU。
我尝试subclassing ObservableCollection 对插入进行分块,希望对它们进行批处理可以提高性能/减少 cpu 工作量,但这种方法似乎需要调用 CollectionView.Refresh,这与在集合上调用 Reset() 相同,而且效率低下当集合中有很多项目时。
清除 observablecollection 并调用 myListView.Items.Refresh() 将其降低到 0 会使 CPU 使用率回到起点。
这里开始没有想法了.. 同样,我的目标是添加/显示大量项目并以最高效的方式显示 8 列网格.. ListView 看起来不错,只是必须有一些方法我可以进一步调整它..
更新
分析后,ObservableCollection 800k 行在网格中,cpu 最密集的工作由:
- (75%) System.Windows.Media.MediaContext.RenderMessageHandler(object resizedCompositionTarget)
- (20%) ObservableCollection.OnCollectionChanged(NotifyCoolectionChanged..)
虽然根据会话这些数字差异很大..
UPDATE 2 .. 好的 BindingList 显然是这里的赢家。
这是并排显示的结果(以刻度为单位),每行有 100 万行(每秒添加 10 个项目):
可观察集合: http://i.imgur.com/7ZoSv.png
绑定列表 http://i.imgur.com/jm5qF.png
您可以看到 CPU 活动的总体下降,以及在 Binding List 案例中处理树所需的大约一半的滴答声!感谢 Akash 提出的这个好主意。
【问题讨论】:
标签: wpf performance