[原创]DebugTools系列(4):AQTime经验总结

简介:
导读这篇文章是AQTime系列的最后一篇,主要介绍一些实用的技巧,因为作者也是初学乍练,我已经将我所知道的都写出来跟大家分享了!关于AQTime,没有涉及到的肯定还很多,至少我还没有完整看完那份400多页的使用手册,相信里面还有很多知识点这个系列都没有覆盖到,不过没关系,我也是在“  I try to learn things is by "teaching"”,所以强烈希望熟悉AQTime的朋友如果正巧路过,留下您的宝贵经验跟大家分享,也非常欢迎AQTime的菜鸟没把你的疑问和困惑提出来,大家一起解决。
记得留下宝贵意见哦!!!

Tip1:如何通过[Event View]找到准确的Modules

记得在 第二篇 文章里我提到了配置分析范围,在 上一篇 最后我们也提到了如果能在一开始就准确地加载必要的Modules,然后只分析收集Modules列表里的Module的性能数据,会有效提高收集数据的速度和分析数据时的工作量。那么,一般我们分析一个应用程序的时候,很多时候可能这个程序并不是我们自己写的,或者我们只是写了其中一小部分,所以我们并不很清楚到底要加载的那些Modules都部署在什么位置,或者说程序到底加载了那些Modules我们也可能根本不清楚。
那么这个时候我们怎么办?我们怎么才能轻松准确地加载最合适的Modules呢?这个Tip就是为了究竟这个问题的,那就是利用AQTime的[Event View]页签记录的值,找到你需要的Modules,[Event View]里会记录程序整个生命周期加载的所有Modules,包括操作系统、框架和程序自身,而且在[Event View]可以直接查看到这些Modules的本地完整绝对路径。说到这里,想必大家已经基本都清楚了吧,要做的就是再AQTime里空跑(至少要加载一个Module)一次完整的你要收集数据的过程,然后去[Event View]里把你需要的Modules挑出来即可,如果觉得在[Event View]里查看不方便,可以通过右键[Save All...]将[Event View]的结果保存为一个HTML文件后再查看,这样会方便很多。



参考上图,看看我们找到了什么,是的,这些就是我们在第一篇文章里就提到过的由ISAPI动态生成的aspx文件对应的类的DLL,这些真是我们需要的,保证准确无误的Modules了!

Tip2:如何设置[Last Results]里临时保存的个数

OK!这个Tip还要从我的一次糗事说起,前段时间大面积调试性能,我一次要收集大约15个功能点的性能问题,都是订单体要求100行大数据量的,本来我们的订单就很大,运行性能已经不是很理想了,如果还是100行的,再加上同时挂上AQTime,还是用我自己的P4 2.6的破机器做服务器,结果就慢的要急死人了,平均每个功能点收集一次需要25分钟以上。所以那天我一上午只收集了大约5个功能点的性能数据,午饭后没有睡午觉,跟同事PK了一会儿街霸对拳皇,就继续收集其他功能的,下午人都有点犯困,警惕性不高,大约收集到第10个功能点时,突然发现[Last Results]列表里为什么只有五组结果呢?上午做的东西都哪去了?!在晕菜了半天以后,最后找到了原因:AQTime默认只能在[Last Results]里保存最近五次的结果数据,第六次的会自动覆盖第一次的,如此反复,也就是说,我下午晕晕的时候,把上午的辛勤劳动果实就那样覆盖掉了!简直太糗了!最后反复确认,被覆盖掉的东西是找不回来的,那些数据只能重新收集一遍了!



如上图所示,在AQTime里是可以通过Panel Options里的"Number of recent results to keep"来设置这个默认值的,所以请大家记住,安装完AQTime以后,记得先把这个值设置大一些,比如100应该足够了!



如上图所示,另一个防止收集结果数据丢失的方法是每次收集完,确认结果有效且需要保持下来备用的,可立即使用右键菜单里的"Move to Saved Results"将结果保存到[Saved REsults]分组里即可,或者使用"Save to File..."保存成单独的aqr文件,这样最保险!

Tip3:如何通过[Summary]快速定位地雷

AQTime在[Summary]页签自动对性能数据从Worst Performance(body only)、Worst Performance(with children)和Routine with max hitCount三个方面进行了汇总,这上个方面其实就是上一篇文章我们介绍的Grid里的[Time]、[Time with Children]和[HitCount],很多时候,这个汇总还是很有用的,例如 上一篇 文章里的地雷,在下图第一项汇总结果里就已经表露无遗了,所以推荐大家在分析性能数据的时候,养成总是先从[Summary]页签开始的良好习惯。


Tip4:如何通过[Editor]同步查看源代码

一般情况下,如果是调试阶段的性能测试,且你加载的Module是在你的本地环境上编译的,也就是说通过Module(一般指DLL或exe),AQTime可以根据其元数据信息自动找到本地的源代码并自动显示在[Editor]页签里,并且跟Grid列表焦点行上的方法自动同步对应。这是一个非常重要且实用的功能,因为在我们分析性能数据的时候,当你怀疑某个地方有地雷的时候,只要打开[Editor]页签就可以直接看到源代码了,这简直是太方便了。
不过有时,还是经常会出现无法正常查看源代码的情况,这时主要检查这几个方面:
1、Grid列表焦点行上的方法是底层框架的或其他你无法获得源代码的,那么查看不到就是正常现象了!这时倒是可以通过[Disassembler]页签查看反汇编的结果,不过这个看起来肯定是没那么舒服了。
2、如果你只是在一个空项目里加载一个别人共享的aqr文件,那么这个时候你可以把能加载的Module都加载上,就可以自动定位到大部分源代码了,因为aqr文件里只记录了方法名和其各种性能数据结果,它需要通过已经加载的Module去关联源代码才行。
3、通过设置"Search Directories..."定位到源代码的位置,有时候因为你加载的Module里记录的源代码路径不一定跟你本地环境的完全相同,而你确实还有这个Module的源代码,那么就需要通过设置查找路径的方式来定位到源代码了,具体请参考下图:


Tip5:如何在Visual Studio里使用AQTime PlugIn

AQTime在安装的时候,会提示是否作为PlugIn关联到Visual Studio环境,如果安装了,那么在VS的ToolBar里就会多出一个Profiler菜单,通过这个菜单,可以进入一个完全嵌入在VS IDE环境中的AQTime环境,用法跟单独打开的AQTime没什么区别,暂时我们感觉到的最大的区别就是没有[Editor]页签,在Grid列表上双击某个方法,如果是当前项目的,就会自动定位到对于的文件上,这样查看和修改源代码确实会比较方便,其他就没什么感觉了,具体可参考下面的图示。



Tip6:AQTime学习资源

1、系统学习AQTime的最佳资源: Download AQtime User Manual  (PDF format) - 7,404K
2、官方的实例: AQtime Case Studies

Debug 探索团队

-欢迎加入博客园.Debug探索团队 Copyright © Justin


本文转自Justin博客园博客,原文链接:http://www.cnblogs.com/justinw/archive/2008/10/30/1320800.html,如需转载请自行联系原作者

相关文章
|
自然语言处理 安全 C++
【C++ 格式化输出 】C++20 现代C++格式化:拥抱std--format简化你的代码
【C++ 格式化输出 】C++20 现代C++格式化:拥抱std--format简化你的代码
9414 4
|
缓存 算法 开发者
【Conan 入门问题】Conan 删除本地缓存后的解决方法
【Conan 入门问题】Conan 删除本地缓存后的解决方法
690 0
|
8月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
247 15
|
9月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
8月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
476 6
|
9月前
|
存储 算法 C++
【c++丨STL】priority_queue(优先级队列)的使用与模拟实现
本文介绍了STL中的容器适配器`priority_queue`(优先级队列)。`priority_queue`根据严格的弱排序标准设计,确保其第一个元素始终是最大元素。它底层使用堆结构实现,支持大堆和小堆,默认为大堆。常用操作包括构造函数、`empty`、`size`、`top`、`push`、`pop`和`swap`等。我们还模拟实现了`priority_queue`,通过仿函数控制堆的类型,并调用封装容器的接口实现功能。最后,感谢大家的支持与关注。
537 1
|
9月前
|
存储 程序员 C语言
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。
|
11月前
|
设计模式 IDE 数据可视化
UML中类图的介绍与使用
类图是 UML 中用于展示系统静态结构的重要工具,包括类、接口及其关系。类图有助于系统可视化、团队沟通、发现设计问题、文档化系统和辅助开发工具。类图的三大元素是类、接口和关系,其中关系又细分为关联、聚合、组合、继承、实现和依赖。类图在设计模式学习和实际开发中非常重要,许多现代 IDE 都支持从类图生成代码或从代码生成类图。
|
安全 Java 测试技术
单元测试一篇汇总
本文详细介绍了软件开发中的单元测试,包括其重要性和好处。单元测试主要用于确保程序模块代码的正确性,常使用的测试框架有JUnit和TestNG。文章重点讲解了JUnit框架,包括其注解、断言方法及JUnit 3.x和4.x的区别。此外,还列举了八大常用的单元测试框架,如Arquillian、JTest、The Grinder、TestNG、JUnit、JWalk、Mockito和PowerMock,帮助读者更好地理解和应用单元测试。
单元测试一篇汇总
|
关系型数据库 数据库
关系型数据库设计规范第三范式(3NF)
【5月更文挑战第14天】关系型数据库设计规范第三范式(3NF)
864 3