Dispatcher Queue性能分析

  一直想要写一点东西,把自己在工作中遇到的东西分享给大家,无奈水平有限,每每想写的时候,就感觉写的东西太过浮浅,同样的东西不如其它人写的有水平,假若自己再写出来可能会给其它人带来困惑,加上自己语言组织能力不行,就懒得写了,由于这两天在分析UI刷新的性能问题,而今天也终于分析出性能损耗点,按捺不住心中的高兴,因此就想在这里给大家分享一下方法。

  Dispatcher Queue性能分析  

  我相信,学习过WPF人都会知道不能直接通过其它线程访问UI控件,原因是由地Windows操作系统使用的单线程的,基于消息处理的用户界面,一次只能有一个线程访问用户界面,与任何轮换线程的交互都必须通过Windows消息泵来封送。而其它线程要访问怎么办,那只能通过消息封送了,常用的代码如Dispatcher.BeginInvoke或Dispatcher.Invoke。封送到UI线程进行处理。在控件与后台逻辑频繁交互的项目中的,这样的封送代码可能是相当的多,而对于界面数据加载慢这样的问题,一一去查这些封送代码显然是相当的不现实,那怎么办?

  其实,在我们封送消息到UI线程时,封送的消息会以FIFO逐一进行处理,当然其还是一个优先级的概念需要理解。对于这样的一个队列,我们可以跟踪加载到队列每个任务的开始及结束时间,即可知道性能耗费点,便可再跟据相关代码进行进一步的分析。

  MSDN中关于DispatcherHooks的定义

DispatcherInactive
在调度程序没有要处理的其他操作时发生。

OperationAborted
中止操作时发生。

OperationCompleted
完成操作时发生。

OperationPosted
将操作发布到调度程序时发生。

OperationPriorityChanged
在更改操作的优先级时发生。

OperationStarted
调用操作时发生。

  我们可以对Dispatcher.Hooks进行上面这些事件的附加即可知道每个任务的进度,详细可研究Msdn。添加到Dispatcher Queue中的每个任务都用一个DispatcherOperation来表示,这个类型有一个Name属性,可以用来标识具体是什么样的任务,由于这个属性是internal类型的,所以获取时需要进行反射获取,代码简单如下:

PropertyInfo pro = typeof(DispatcherOperation).GetProperty("Name", BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.NonPublic);

  打印出每个任务的Name属性,就可以进一步分析性能了。

  由于添加到Dispatcher Queue中的任务是相当的多,如UI渲染,Input事件等,可以把相关的任务都打印到txt中,然后搜索自己程序中的命名空间,即可找到自己程序添加相关任务,使用NotePad++, 相当好用。

  Ending!!!

时间: 2024-10-15 05:21:47

Dispatcher Queue性能分析的相关文章

jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令

公司内部同事分享的一篇文章 周末看到一个用jstack查看死锁的例子.昨天晚上总结了一下jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令.供大家参考 1.Jstack 1.1   jstack能得到运行java程序的java stack和native stack的信息.可以轻松得知当前线程的运行情况.如下图所示 注:这个和thread dump是同样的结果.但是thread dump是用kill -3 pid命令,还是服务器上面少用kill为妙 1.2   命名行格式

超全整理!Linux性能分析工具汇总合集

出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识,文档中的工具,是不可能完全掌握的,另外对系统性能分析和优化是一个长期的系列. 本文档主要是结合Linux 大牛,Netflix 高级性能架构师 Brendan Gregg 更新 Linux 性能调优工具的博文,搜集Linux系统性能优化相关文章整理后的一篇综合性文章,主要是结合博文对涉及到的原理和性

性能分析之-- JAVA Thread Dump 分析综述

性能分析之-- JAVA Thread Dump 分析综述 一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工具.每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力,虽然各个 Java虚拟机打印的thread dump略有不同,但是大多都提供了当前活动线程的快照,及JVM中所有Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名及所执行的方法,如果可能的话还有源代码的行数. 1.2 T

老李分享:《Java Performance》笔记1——性能分析基础 1

老李分享:<Java Performance>笔记1——性能分析基础 1.性能分析两种方法: (1).自顶向下: 应用开发人员通过着眼于软件栈顶层的应用,从上往下寻找性能优化的机会. (2).自底向上: 性能专家从软件栈底层的CPU统计数据(例如CPU高速缓存未命中率.CPU指令效率)开始,逐渐上升到应用自身的结构或应用常见的使用方式. 2.CPU使用率: 大多数操作系统的CPU使用率分为用户态CPU使用率和系统态CPU使用率. 用户态CPU使用率:执行应用程序代码的时间占总CPU时间的百分比

Linux 性能分析工具汇总合集

出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识,文档中的工具,是不可能完全掌握的,另外对系统性能分析和优化是一个长期的系列. 本文档主要是结合Linux 大牛,Netflix 高级性能架构师 Brendan Gregg 更新 Linux 性能调优工具的博文,搜集Linux系统性能优化相关文章整理后的一篇综合性文章,主要是结合博文对涉及到的原理和性

java死锁性能分析

java故障诊断案例分析: 死锁瓶颈(性能分析) 只要是java程序, 都可以使用这种方式来分析性能的瓶颈 1. Dump信息查看 Thread dump信息对于性能诊断非常有用 kill 命令使用 kill : 杀死一个进程 ? -9: 强制杀死一个进程 ? -3: 打印进程的Thread dump信息 linux系统: kill -3 pid windows: 在命令行窗口上, 按一个组合键: ctrl + break(fn+B键) 2. 死锁程序分析 java的一个死锁程序代码: publ

性能测试分析与性能调优诊断--史上最全的服务器性能分析监控调优篇

一个系统或者网站在功能开发完成后一般最终都需要部署到服务器上运行,那么服务器的性能监控和分析就显得非常重要了,选用什么配置的服务器.如何对服务器进行调优.如何从服务器监控中发现程序的性能问题. 如何判断服务器的瓶颈在哪里等 就成为了服务器性能监控和分析时重点需要去解决的问题了. 1     服务器的性能监控和分析 1.1      Linux服务器的性能指标监控和分析 1.1.1       通过vmstat深挖服务器的性能问题 1.1.2       如何通过mpstat 分析服务器的性能指标

Linux性能分析工具汇总合集

出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识,文档中的工具,是不可能完全掌握的,另外对系统性能分析和优化是一个长期的系列. 本文档主要是结合Linux 大牛,Netflix 高级性能架构师 Brendan Gregg 更新 Linux 性能调优工具的博文,搜集Linux系统性能优化相关文章整理后的一篇综合性文章,主要是结合博文对涉及到的原理和性

mysql索引结构原理、性能分析与优化

原文  http://wulijun.github.com/2012/08/21/mysql-index-implementation-and-optimization.html 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页查阅找出需要的资料. 唯一索引(unique index) 强调唯一,就是索引值必须唯一. 创建索引: create unique index 索引名 on 表名(列