前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用dotTrace工具对.Net程序进行性能分析实战

使用dotTrace工具对.Net程序进行性能分析实战

作者头像
程序你好
发布2020-04-27 19:39:16
1.8K0
发布2020-04-27 19:39:16
举报
文章被收录于专栏:程序你好程序你好

提起dotTrace不用多说,是个很经典的性能分析工具,可以分析windows form和asp.net 的application,它能够快速分析、过滤、函数查找(快速定位function,并且导航)和查看源码等等,具体的软件使用操作这里就不进行介绍了,感兴趣的朋友可以网上查操作手册或使用说明。

手头有一款.Net桌面应用程序,每次启动都很慢,准备使用这个工具分析一下,看怎么改进启动速度。

1、首先通过dotTrace启动运行准备分析的程序exe文件

2、点击“Get Snapshot and wait”按钮,获取分析报告的快照。

3、一般情况,如果不考虑方法调用次数,我们通常分析Threads Tree就可以。

如上图:这里显示两个线程,主线程总共花费17秒,线程10是一个后台网络远程下载数据的线程,花费9秒(因为多线程并行执行的,目前需要着重分析主线程)。

因为快照中把每个执行的方法都列了出来,还有每个方法花费的时间。去掉系统本身花费的时间,然后去掉所使用平台花费的时间,我们把重点放在自己应用程序所写的代码上。

比如说这里:InitializeCompent方法,花费了678毫秒的时间。这个方法是.net 框架提供的方法,我们一般没有可优化的空间,进行分析会发现时间花在了WPF xaml文件装载上了。不过从这里也能看出WPF的性能确实不高。

分析启动Run()方法的执行情况,发现下面这些方法花费时间较多,是可能有问题的方法。

CreateShell方法

InitilizeModules方法

ConfigurationContainer方法

StartUpTomcat方法

LoadDBMySql方法

(一)、其中StartUpTomcat是调用命令行Shell执行一些批处理命令,LoadDBMysql是调用数据服务进行更新sql语句的操作,这两个方法花费了1秒多时间。

可以新开后台线程执行这两个方法,这样就能不影响主线程的时间。

代码如下:

Task startUpTask = Task(() => StartUpTomcat()); startUpTask.ContinueWith(t => LoadDBMySql()); startUpTask.Start()

修改后分析报告,会多出一个后台线程,执行这两个方法。

(二)、接下来分析createShell方法,因为用的Prism4.0基于WPF的框架,createShell由框架提供,还需要分析一下该方法具体执行步骤,单击展开该方法的各个节点进行分析。

终于找到疑点了,有两个方法花费了3秒钟。如图:

有两个初始化类的调用,一个是DataAccess类,另外一个是WorkDataSynacProxyService类。

DataAccess是IBatisNet的封装,WorkDataSynacProxyService是数据同步的一个服务代理类。由于启动时根本不需要执行数据库的操作,可以把这部分代码延迟执行,或者还是使用老办法,后台新开线程执行初始化数据库的操作类,WorkDataSynacProxyService初始化代码去掉,换成使用时在创建实例的方式。

上面两点都完成以后,节约3秒钟启动时间。

(三)、接下来接着分析,InitilizeModules方法,这个方法有Prism框架提供,经过分析我们发现主要问题是从文件目录中装载模块DLL文件太慢,GetExportedTypes方法,怀疑是因为使用反射导致的性能问题。

因为Prism框架中支持几种方式的分模块开发和部署,DirectionModuleCatalog目录的方式是最简单的,同时也是效率最低的方式。不再使用DirectionModuleCatalog的方式加载模块,可以采用配置文件,或代码装载的方式来提高这部分加载性能,或者干脆实现代码中预装载,这样可以大幅度提高模块装载速度。

(四)、最后是ConfigContainer方法,如下图,分析发现两个RegisterMap方法(应用于Domain对象和DTO对象进行转换),使用反射来创建对象实例,总共花费了1.4秒时间。

新开后台线程,把这两部分代码放到后台线程执行。

代码:var task = new Task(() => RegisterDomainAdapterMaps()); task.Start();

到此为止此次性能分析算是基本完成了,一般来说我们着重观察执行时间大于500毫秒的方法。

总的来说做性能分析首先需要明确性能瓶颈在哪里,一般都是数据操纵(I/O)操作,网络操作等。

明确是否代码的质量有问题,也要看关注调用次数,是否某些方法调用次数过多,比如在循环中写了不恰当的代码等。

还有就是明确是否存在Block的代码,比如:远程网络连接,文件I/O操作等。

使用缓存或者多线程,以提高性能。

总归就是一句话,如果能准确的找到问题瓶颈,你的问题已经解决了一半。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序你好 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档