2012-03-22 40 views
5

我已经列出了一切可以帮助提高具有大量控件的非常复杂的应用程序中的性能的所有内容。如果你想添加你的,欢迎你!解决WPF应用程序的性能问题

  • 如果你知道控件的大小,除去汽车,进入真正的价值,所以家长不必解析所有孩子的检查大小,他需要
  • 设置参数IsHitTestVisible =假如果元素不需要是交互式
  • 冻结所有的对象,你可以
  • 使用静态的资源,而不是动态资源
  • 不要使用椭圆对象,变换椭圆的路径
  • 唐没用文本框或标签,如果你可以使用一个TextBlock
  • 使用画布,而不是网格时可能
  • 没有的FlowDocument
  • 虚拟化! VirtualizingStackPanel代替的StackPanel
  • 不要使用名单中,是的ObservableCollection更快的方式
  • 使用绘图库,它的速度更快,则形状库
  • 检查结合!如果绑定不工作,它可能会很慢
  • 不要使用Visibility.Hidden,使用Visibility.Collapsed时,你可以
  • 的DependencyProperty是快3倍,然后INotifyPropertyChanged的
  • StreamGeometry快那么的PathGeometry
  • 清除事件处理程序,当你完成它们!
  • 如果您的应用程序是硬件渲染,不要使用对象的不透明度属性,如果可以的话,用他的颜色混浊
  • 检查(二线)
  • 减小图像的尺寸/质量时,你可以
  • 渲染图像比渲染矢量更快!

工具,我用:

  • WPF督察
  • 史努比
  • WPFPerf套房
  • 的Visual Studio探查
  • CLR探查器为.NET
+2

恐怕它不适合在一个问答网站,如stackoverflow。 – ken2k 2012-03-22 16:28:28

+0

这不是一个问题,如果有人正在寻找关于WPF性能的帮助,这是一个答案。我一直在寻找这样的主题大约一个月,如果我可以帮助完成我的测试和研究后,我会很高兴 – mlemay 2012-03-22 16:44:19

+0

我谷歌搜索WPF性能优化,并得到了以下http://msdn.microsoft.com/ en-us/library/aa970683.aspx http://www.michaelflanakin.com/Weblog/tabid/142/articleType/ArticleView/articleId/1015/WPF-Performance-Tips.aspx – Paparazzi 2012-03-22 18:20:28

回答

0

这是真的是一个评论,而不是一个回答但没有足够的空间。

ObservableCollection的方式比List更快直观,因为ObservableCollection实现了iList。

我有一个660,000字的列表,我在ListView(虚拟化)上测试过。 创建下面的集合类型并创建按钮以在后面的代码中切换绑定。所有集合都瞬间呈现(虚拟化的力量)。

变量是从集合中创建集合和需要的功能的时间。使用SQLdataReader来填充集合。 SQLdataReader存在可变性。每10次运行得到可重复的结果至2位有效数字,并将平均值报告给3位有效数字。列表击败ObservableCollection大约400毫秒。没有测量内存,但清单清晰地将使用更少的内存。

毫秒加载660,000个字符串,每个字符串平均大约40个字符。

1510 List 
    1780 Dictionary 
    1820 HashSet 
    1980 ObservableCollection 
    8000 SortedDictionary 

在一个非常大的集合HashSet会比List更好。 HashSet应该击败词典 - 这些数字是在这个有限的非严格测试的可变性范围内。

归结为功能。 ObservableCollection支持动态插入和删除。如果你需要动态插入和删除,那么它是迄今为止最好的选择。如果你不需要动态插入和删除,那么我的经验是List是一个更好的选择(通过ListItem列表的iNotifyPropertyChanged支持动态修订)。

列表保留项目被添加的顺序。 HashSet不保留该订单。选择使用哪个集合的因素很多。 http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx

对单个项目的访问时间发表了评论。我使用List,ObservableCollection和Dictionary访问了项目[1],[100000],[200000],[300000],[400000],[500000],[600000]。他们都是12毫秒。访问时间是一个死气沉沉,可重复的。

+0

我认为他的意思是:“不要将列表作为ItemsSource绑定到你的ItemsControl,ObservableCollection是更快的方式”:)不是ObservableCollection本身就是一个快速容器。 – dowhilefor 2012-03-22 16:34:10

+0

问题不在加载,确定它会更快与列表,但之后访问List中的单个元素,它比ObservableCollection(此时列表慢90倍)慢 – mlemay 2012-03-22 17:22:59

+0

好吧我会看看访问单个元素的时间。 – Paparazzi 2012-03-22 17:27:24