避開使用XAML的性能陷阱

openkk 12年前發布 | 11K 次閱讀 XAML

雖然 DependencyProperty 和 DependencyObject 是實現大部分 XAML 特性的基礎,但是它們也會帶來一些性能開銷。MSDN 上的一篇文章《XAML 平臺上的 C# 優化》(Optimizing C# for XAML Platforms)詳細討論了該問題,并給出了一些解決方案以盡量減少由此造成的性能影響。

訪問和設置 DependencyProperty 值的響應時間要比訪問 CLR 屬性的時間長上幾個數量級。這在低性能硬件(如 Windows 7 Phone)以及緊密循環或復雜 LINQ 語句中尤為明顯。文章中提出了一些解決方案,包括:

  • 能用 CLR 屬性完成工作就不要用 Dependency 屬性;

  • 緩存 DependencyProperty 以避免反復進行 get 操作;在 set 操作前先行比較新值與當前值(這是因為重復設置屬性值與設置新值的代價一樣高)。此類優化可以在含有屬性的類中完成,或者在代碼調用前(例如在遍歷循環前)完成;

  • 考慮 LINQ 查詢的復雜度(如查詢所需要遍歷全部條目的總次數)之后,再決定是使用它還是回歸到編寫循環;

  • 避免使用延遲初始化(lazy initialization),如果它會帶來更多的工作量(如在循環內部時);

  • 如果在 ItemControl 內部使用 Panel 來實現多條目,請使用支持虛擬化的 panel,例如 VirtualizationStackPanel。

使用 XAML 大展身手的兩處地方——一處是在 WPF 客戶端上實現富客戶端體驗/媒體;另一處是在硬件資源受限的 Windows Phone 平臺上。由于兩者都需要良好的性能,因此了解這些內在原理以編寫出高性能代碼是值得的。

關于特定平臺上的性能注意事項,請查閱 MSDN 上的以下資料:

查看英文原文:http://www.infoq.com/news/2012/02/performance-xaml

來自: InfoQ

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!