当前位置: 首页 > news >正文

用 dotTrace 进行性能分析时,各种不同性能分析选项的含义和用途

对 .NET 程序进行性能分析,dotTrace 能应对绝大多数的场景。在开启一个进程进行性能分析之前,我们会看到一些性能分析选项(Profiler Options)。本文将介绍这几个选项的含义,并用实际的例子来说明其用途。


本文内容

      • dotTrace 的性能分析选项
      • Sampling 采样
      • Tracing 追踪
      • Line-by-line 逐行
      • Timeline 时间线
        • 参考资料

dotTrace 的性能分析选项

你可以前往 Download dotTrace: .NET Performance Profiler by JetBrains 下载 dotTrace。

本文要说的就是下图右边的那四个选项,在启动一个进程进行性能分析之前可以看得见的。

dotTrace 启动进程进行性能分析的界面
▲ dotTrace 启动进程进行性能分析的界面

有四个选项:

  • Sampling
  • Tracing
  • Line-by-Line
  • Timeline

Sampling 采样

界面中的描述为:

Accurate measurement of call time. Optimal for most use cases.

使用此选项进行启动进程后,会准确测量不同方法的执行时间,但不会统计方法的调用次数。

这适用于大多数场景。尤其是如果你还没有对你的程序进行过任何性能分析的情况下,先使用这个选项进行一个初步分析大致确定性能问题是很方便的。

Tracing 追踪

界面中的描述为:

Accurate measurement of calls number. Optimal for analyzing algorithm complexity.

会准确地测量调用次数。但在此选项下,时间的测量将由于性能分析的开销过大而可能不准确。

如果你使用 Sampling 分析方式得不到你想要的性能分析数据的时候,你可能用得到此选项。例如,当你分析算法复杂度,需要明确知道方法的调用次数,而不需要知道方法的准确执行时间的时候。

Line-by-line 逐行

界面中只写了一句根本无法理解的话:

Advanced use cases only.

仅仅说了这是高级使用场景,名没有说什么样的场景。

这个选项下,分析器会测量每行代码。由于性能分析的开销过于巨大,调用时间的测量也是不准确的。如果要降低此选项下的开销,你可以使用过滤器仅分析特定的方法。关于使用过滤器,可以阅读官方文档 Profiler Options - Help - dotTrace。

当你已经通过其他方法得知性能问题出现在哪个具体的方法时你可能需要用到这个选项,这会分析此方法的每一行代码。

Timeline 时间线

界面中的描述为:

Measurement of temporal performance data. Optimal for most use cases including analysis of multi-threaded applications.

收集有关线程状态、应用程序事件和其他多线程数据的时态数据。此方法基于 Windows 的事件跟踪器(ETW)。

推荐用于大多数情况,尤其是分析多线程应用程序的时候。你可以用这个选项来确定 UI 卡顿或不响应的原因,可以分析过多的 GC(垃圾回收),可以分析不均匀的工作负载分配、IO 不足或者其他各种异常。

由于需要用到 Windows 的事件跟踪器(ETW),所以你可能遭遇 ETW 相关的问题。具体可以阅读 用 dotTrace 进行性能分析时,Timeline 打不开?无法启动进程?也许你需要先开启系统性能计数器的访问权限。


参考资料

  • Profiler Options - Help - dotTrace

相关文章:

  • 如何创建一个基于 .NET Core 3 的 WPF 项目
  • 将基于 .NET Framework 的 WPF 项目迁移到基于 .NET Core 3
  • 了解 .NET 的默认 TaskScheduler 和线程池(ThreadPool)设置,避免让 Task.Run 的性能急剧降低
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • 在有 UI 线程参与的同步锁(如 AutoResetEvent)内部使用 await 可能导致死锁
  • 不要使用 Dispatcher.Invoke,因为它可能在你的延迟初始化 LazyT 中导致死锁
  • 定义一组抽象的 Awaiter 的实现接口,你下次写自己的 await 可等待对象时将更加方便
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 中什么样的类是可使用 await 异步等待的?
  • Visual Studio 2017 以前的旧格式的 csproj Import 进来的 targets 文件有时不能正确计算属性(PropertyGroup)和集合(ItemGroup)
  • 使用 ReSharper,输入即遵循 StyleCop 的代码格式化规范
  • StyleCop 是什么,可以帮助团队带来什么价值?
  • 文件和文件夹不存在的时候,FileSystemWatcher 监听不到文件的改变?如果递归地监听就可以了
  • C#/.NET 使用 CommandLineParser 来标准化地解析命令行
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • 【个人向】《HTTP图解》阅后小结
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Android优雅地处理按钮重复点击
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Java比较器对数组,集合排序
  • MySQL QA
  • React16时代,该用什么姿势写 React ?
  • Redux 中间件分析
  • Web Storage相关
  • 基于 Babel 的 npm 包最小化设置
  • 聊聊directory traversal attack
  • 每天10道Java面试题,跟我走,offer有!
  • 面试总结JavaScript篇
  • 如何用vue打造一个移动端音乐播放器
  • 入门级的git使用指北
  • 实战|智能家居行业移动应用性能分析
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 一道面试题引发的“血案”
  • 06-01 点餐小程序前台界面搭建
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​ubuntu下安装kvm虚拟机
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #微信小程序(布局、渲染层基础知识)
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (003)SlickEdit Unity的补全
  • (AngularJS)Angular 控制器之间通信初探
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (过滤器)Filter和(监听器)listener
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (力扣)1314.矩阵区域和
  • (七)Java对象在Hibernate持久化层的状态
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (十一)手动添加用户和文件的特殊权限
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .