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

避开使用XAML的性能陷阱相关推荐

  1. 贯穿应用开发始终的八大性能陷阱

    数据库访问低效.框架配置错误.内存使用过度.网页臃肿,以及不遵循常见Web性能最佳实践都是应用开发中常见的.影响应用性能的主要陷阱 .技术性能公司Computeware从实际案例总结了贯穿应用始终的八 ...

  2. memset性能陷阱

    性能杀手:"潜伏"的memset [memset性能陷进] memset是大家常用的函数,而且一般的编程书籍都会谆谆告诫大家:申请内存后要初始化,防止使用未经初始化的内存导致不可预 ...

  3. java 排序性能_Java8排序–性能陷阱

    java 排序性能 Java 8带来了lambda的所有优点,使我们能够使用声明式样式进行编程. 但这真的免费吗? 我们是否应该担心必须为新的编程功能付出的代价? 这是一个我们可能要担心的例子. 考虑 ...

  4. Java8排序–性能陷阱

    Java 8带来了lambda的所有优点,使我们能够使用声明式样式进行编程. 但这真的免费吗? 我们是否应该担心必须为新的编程功能付出的代价? 这是一个我们可能要担心的例子. 考虑对这个简单类的实例进 ...

  5. 【开发者成长】Vue.js 中有哪些性能陷阱

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 我内心深处对游戏的热爱,让我一直渴望能自己制作一些电子游戏.几个月前我开始将这种梦想变为现实,并第 ...

  6. 做抖音运营,一定要避开的3类数据陷阱

    随着短视频的日益流行,越来越多的内容工作者投身这个行业,也有越来越多的机构在发布研究报告和数据,越来越多的培训班用数据"武装"自己.但很多时候,那些抖音推广展示的数据或是相关的报告 ...

  7. 【2017年第2期】开发商业智能应用 小心大数据“陷阱”

    黄锦辉 香港中文大学工程学院,香港 999077 摘要:大数据的应用和研究是信息爆炸时代的热点话题.就如何更智能地发现大数据中的有用信息展开讨论,探讨了大数据中的"陷阱"和其引发的 ...

  8. Apache Spark Jobs 性能调优

    当你开始编写 Apache Spark 代码或者浏览公开的 API 的时候,你会遇到各种各样术语,比如transformation,action,RDD(resilient distributed d ...

  9. iOS核心动画高级技术(十二) 性能调优

    Code should run as fast as necessary, but no faster. 代码应该运行的尽量快,而不是更快 - 理查德 在第一和第二部分,我们了解了Core Anima ...

最新文章

  1. ES6中的Promise详解
  2. 他是第一个到达学校的人英语_日本留学:不需要英语成绩的大学盘点·私立学部篇(第三弹)...
  3. 简书上的大牛总结的 ServerSocket Accept() 的确是阻塞方法 与猜想一致 一些理解 转载如下
  4. 别在用U盘拷贝源码带回家了,有童鞋被判刑啦!
  5. 中国超导产业投资风险及应用前景调研报告2021版
  6. ABAP Update Navigation Index
  7. 阿里云存储OSS中设置上传文件content type
  8. 神舟笔记本bios_海尔雷神(蓝天)神舟战神游戏本风扇狂转掉电大写灯狂闪维修实例...
  9. 使用python3连接hiveserver2的方法
  10. lincode 题目记录6
  11. layui select change事件_一道2020年全国生物学联赛试题背后的“眼齿鸟事件”
  12. Android入门(四)UI-创建自定义控件
  13. paip.erlang环境搭建和脚本式escript运行halo world 在windows下attilax总结
  14. spss中有关独立样本T检验的详细介绍(包含操作过程和结果分析)
  15. linux日志过大怎么查看,Linux查看日志常用命令
  16. 如何批量将图片转换为 PDF 文档
  17. Android高仿淘宝订单列表效果,列表中嵌套列表
  18. 【SQL文档整理系列1】MySQL创建procedure(可以用来造测试数据)
  19. MD5大小写,32,16
  20. 怎样理解心藏神,肝藏魂,脾藏意,肺藏魄,肾藏精志?

热门文章

  1. php设置外键约束,关于php:禁用教义外键约束
  2. 在服务器客户端怎么启用协议,如何启用客户机的WINS功能
  3. Python程序:输出斐波那契数列
  4. 【BZOJ3295】动态逆序对,CDQ分治/BIT套权值线段树
  5. flask web开发是前端还是后端_Flask Web开发实战:入门、进阶与原理解析 PDF 全格式版...
  6. 左对齐杨辉三角python_python实现杨辉三角思路
  7. 【Level 08】U08 Positive Attitude L5 Satisfy your need to know
  8. 【英语学习】【English L06】U02 Food L1 Food on the menu
  9. 【英语学习】【WOTD】avuncular 释义/词源/示例
  10. python自动打开浏览器下载zip,并且提取内容写入excel