避开使用XAML的性能陷阱

openkk 10年前
     <p align="justify"> 虽然 DependencyProperty 和 DependencyObject 是实现大部分 XAML 特性的基础,但是它们也会带来一些性能开销。MSDN 上的一篇文章《<a href="/misc/goto?guid=4958331427213647075">XAML 平台上的 C# 优化</a>》(Optimizing C# for XAML Platforms)详细讨论了该问题,并给出了一些解决方案以尽量减少由此造成的性能影响。</p>    <p align="justify"> 访问和设置 DependencyProperty 值的响应时间要比访问 CLR 属性的时间长上几个数量级。这在低性能硬件(如 Windows 7 Phone)以及紧密循环或复杂 LINQ 语句中尤为明显。文章中提出了一些解决方案,包括:</p>    <ul>     <li> <p>能用 CLR 属性完成工作就不要用 Dependency 属性;</p> </li>     <li> <p>缓存 DependencyProperty 以避免反复进行 get 操作;在 set 操作前先行比较新值与当前值(这是因为重复设置属性值与设置新值的代价一样高)。此类优化可以在含有属性的类中完成,或者在代码调用前(例如在遍历循环前)完成;</p> </li>     <li> <p>考虑 LINQ 查询的复杂度(如查询所需要遍历全部条目的总次数)之后,再决定是使用它还是回归到编写循环;</p> </li>     <li> <p>避免使用延迟初始化(lazy initialization),如果它会带来更多的工作量(如在循环内部时);</p> </li>     <li> <p>如果在 ItemControl 内部使用 Panel 来实现多条目,请使用支持虚拟化的 panel,例如 VirtualizationStackPanel。</p> </li>    </ul>    <p align="justify"> 使用 XAML 大展身手的两处地方——一处是在 WPF 客户端上实现富客户端体验/媒体;另一处是在硬件资源受限的 Windows Phone 平台上。由于两者都需要良好的性能,因此了解这些内在原理以编写出高性能代码是值得的。</p>    <p align="justify"> 关于特定平台上的性能注意事项,请查阅 MSDN 上的以下资料:</p>    <ul>     <li> <p><a href="/misc/goto?guid=4958331428014691796">优化 WPF 应用程序性能</a></p> </li>     <li> <p><a href="/misc/goto?guid=4958331428817411255">Windows Phone 应用程序中的性能注意事项</a></p> </li>    </ul>    <p align="justify"><strong> 查看英文原文:</strong><a href="/misc/goto?guid=4958331429612261529">http://www.infoq.com/news/2012/02/performance-xaml</a></p>    <div id="come_from">     来自:     <a id="link_source2" href="/misc/goto?guid=4958331430409958493" target="_blank">InfoQ</a>    </div>