• 避开使用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上的以下资料:

  • 相关阅读:
    Steps to Writing Well----Reading Notes
    How to Improve Reading Skills
    Requirement-Driven Linux Shell Programming
    Linux tar command usage
    MVC和MVVM模型
    js中特殊的宏任务
    js 超浓缩 双向绑定
    JavaScript 中的遍历详解
    多段动画整合为一个动画的思路
    Js事件循环(Event Loop)机制
  • 原文地址:https://www.cnblogs.com/shihao/p/2375056.html
Copyright © 2020-2023  润新知