2012-03-22 43 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