虽然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上的以下资料: