最近测试报了一个问题:页面加载慢,代码慢怎么办,代码慢在了哪里呢?于是决定使用DotTrace来进行性能分析,简直打开了通往新世界的大门,玩儿起来太爽了。接下来我用这篇实践来手把手教大家怎么玩儿DotTrace.

  • DotTrace简介,简单介绍DotTrace如何使用,安装方式,配置说明
  • DotTrace实践,使用DotTrace进行列表加载慢、导出慢的问题分析,如何使用DotTrace进行性能分析,包括Controller接口调试以及单元测试接口调试

好,接下来就依据目录顺序来讲解下。

DotTrace简介

什么是DotTrace,在项目开发之中,前期可能主要以保证任务完成为主,对于性能优化主要在于开发完成之后再来进行。可能在测试的时候发现部分接口的代码执行时间过长,但是又毫无头绪,这个时候你就需要性能分析工具来协助你排查问题了。就像我现在遇到的情况, 别人说你慢,你得查出哪里慢,是否能优化,如果不慢,确实需要那么多时间,你也可以给出证据

DotTrace安装

我这里使用的是VS2019集成版,你也可以考虑使用本地安装包,简单介绍下集成的安装方式,如果需要本地安装包可以私聊我。首先通过VS的扩展搜索联机搜索DotTrace,点击 扩展----管理扩展 ,然后如下图所示安装:
在这里插入图片描述

然后在镜像文件点击安装即可,我这里已经安装了,所以显示的是Repair,大家安装的时候可以选择Install:
在这里插入图片描述
安装好之后可以通过如下方式打开进行分析:点击扩展------点击ReSharper-------点击Profile-------点击 Run Application Performance Profiling,然后就可以召唤出调试选项啦,我这里使用的本地IIS站点调试,当然也可以直接附加到对应的进程上调试。
在这里插入图片描述
点击run之后刷新站点页面, 将站点host到本地,准备好之后点击start开启分析 ,分析完成后 点击Get Snapshot and Wait ,读取快照信息
在这里插入图片描述
当然还有一种方式,直接在单元测试上就可以开启分析:
在这里插入图片描述

DotTrace参数说明

在上图的使用说明中,我们可以看到如下几个参数,我比较推荐Tracing和Line-by-Line,其实就比较够用了。

Profiler Options 作用与描述 场景分析
Sampling 通过获取 CLR 内部一个方法开始执行和结束执行的时间差来计算的分析时间。这是最快的方法,它用于精确测量程序运行时间,但可能会丢失一些数据。使用此配置类型可使你快速获取应用程序的的总体性能。 这适用于大多数场景。尤其是如果你还没有对你的程序进行过任何性能分析的情况下,先使用这个选项进行一个初步分析大致确定性能问题是很方便的。
Tracing 慢于 Sampling 的方法,但是可以准确地测量特定方法被调用的准确次数。它是通过获取 CLR 内部一个方法开始执行和结束执行的时间差来计算的分析时间。 如果你使用 Sampling 分析方式得不到你想要的性能分析数据的时候,你可能用得到此选项。例如,当你分析算法复杂度,需要明确知道方法的调用次数,而不需要知道方法的准确执行时间的时候。
Line-by-line 通过收集代码执行的每条语句的时间来进行比较,它计算出的时间更加精确。该方法适用于你已经知道性能问题大概在哪里出现,并要找到具体某一个出现性能问题的时候。 当你已经通过其他方法得知性能问题出现在哪个具体的方法时你可能需要用到这个选项,这会分析此方法的每一行代码。
Timeline 采取抽样的方式,每隔一段时间 (10 ms),会暂停所有线程,并抓取堆栈里的信息,然后才计算出代码执行时间差。使用这个方式可能会导致一些执行时间少于 10 ms 的方法无法被抓取到。 推荐用于大多数情况,尤其是分析多线程应用程序的时候。你可以用这个选项来确定 UI 卡顿或不响应的原因,可以分析过多的 GC(垃圾回收),可以分析不均匀的工作负载分配、IO 不足或者其他各种异常。

DotTrace实践

接下来就来分别分析下代码慢的问题,由于涉及到公司的代码,不便使用其快照信息,我们自己写个单元测试看看它的性能怎么样。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace UnitTestProject1
    [TestClass]
    public class UnitTest1
        [TestMethod]
        public void TestMethod1()
            var result = 0;
            for (var i = 0; i < 1000; i++)
                result += i + 10;
            for (var i = 0; i < 10000; i++)
                result = GetDouble(result);
            Assert.IsNotNull(result);
        public int GetDouble(int single)
            return single * 2;

点击分析后获取到快照,然后在快照里搜索我们想要的方法:
在这里插入图片描述
搜索该方法,我们就可以看到该方法以及其调用的方法链中各个方法的调用时间,甚至能直接对比到每一行的代码性能损耗:
在这里插入图片描述
因为我们这个是比较简单的单元测试,所以前后耗时不过1毫秒。
在这里插入图片描述

当然我们选中方法,右击属性还可以看到具体单次调用时间,可以看到单次调用不过1us,可以说快的飞起。

刚开始用这个工具玩儿的特别开心,感觉能透过表层直接看到本质,可以直接越过现象发现本质问题,项目中分析出了两个浅层不易发现的问题很开心,就像治病救人一样hhhh。发现jetbrains全家桶真的太强了,大佬说性能调优是迈向高阶开发的第一步,希望能越走越远吧。

最近测试报了一个问题:页面加载慢,代码慢怎么办,代码慢在了哪里呢?于是决定使用DotTrace来进行性能分析,简直打开了通往新世界的大门,玩儿起来太爽了。接下来我用这篇实践来手把手教大家怎么玩儿DotTrace.DotTrace简介,简单介绍DotTrace如何使用,安装方式,配置说明DotTrace实践,使用DotTrace进行列表加载慢、导出慢的问题分析,如何使用DotTrace进行性能......
最近一周比较忙,主要的工作内容是在做一个叫“键盘精灵”的东西,简单来讲就是将很多数据放到内存,对这些数据进行快速检索,然后找出根据输入条件最匹配的10条记录并予以展示。具体和下面两款炒股软件的相关功能类似:数据以文本形式存在文件,且数据量较大,有近20万条,每一条记录有几个字段,以分隔符分割。当时使用的是6万条记录的测试数据,文本文件将近10M,这个模块加载到内存并建立缓存之后,大概会占用将近70-80M的内存。自我接手以后,主要的任务就是降低内存消耗和提高匹配效率。拿到代码后,第一步就是看设计文档,然后断点一步一步的看代码,大概明白了逻辑之后,发现思路有一些问题。之前的代码处理流程思路大
使用dotTrace进行性能,内存分析 dotTrace6.0里面主要有两个可以用来做性能分析,一个是DotTrace 可以分析执行时间,Dotmemory 可以分析内存占用 Dotmemory提供了内存分析功能,统计抓取的时间段内各个堆栈执行过程使用的内存大小,按照堆栈执行情况树状排序;和它之前提供的时间统计类似
2、强制垃圾回收 3、多dispose,close 4、用timer,每几秒钟调用:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);具体见附录。 5、发布的时候选择Release 6、注意代码编写时少产生垃圾,比如String + String就会产生大量的垃圾,可以用StringBuffer.Append 7、this.Disp
注意:此库的支持非常有限。 解决这么多设备和配置的问题几乎是不可能的。 社区可能会提供一些帮助,但您将主要靠自己。 如果您提交问题,请提供相关代码片段以及有关您的操作系统、.NET 版本和设备的详细信息。 欢迎和赞赏拉取请求。 隐藏图书馆 该库使您能够枚举 .NET 的 Hid 兼容 USB 设备并与之通信。 它提供同步和异步读写功能以及插入和移除设备的通知。 这个库适用于 x86 和 x64。 PM> Install-Package hidlibrary 本杰明&middot;韦格曼 jwelch222 托马斯&middot;哈默 朱利安西伯特 乔治&middot;哈恩 里克&middot;范&middot;利斯霍特 保罗&middot;特兰登 尼尔&middot;泰森 布鲁诺&middot;尤奇利 斯布莱克莫尔 马雷克&middot;罗斯科 比尔普雷斯科特 阿南斯&middot;雷切拉 感谢 JetBrains 为R#和dotTrace提供 OSS 许可证! 百度百科:dotTrace 是一个包含了可用于.NET应用程序的性能分析器(dotTrace Performance) 和内存分析器(dotTrace Memory)的套件。 dotTrace Performance可帮助用户对各种.NET框架内的应用程序的性能瓶颈进行检测,能够帮助.Net开发者以最快的方式找到并移除性能上的瓶颈。 dotTrace Memory 则能帮助用户发现内存泄露并能对基于.NET 4.0以上框架的应用程序进行内存占用优化。 我下载安装的是破解版,链接
3、多dispose,close 4、用timer,每几秒钟调用:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);具体见附录。 5、发布的时候选择Release 6、注意代码编写时少产生垃圾,比如String + String就会产生大量的垃圾,可以用StringBuffer.Append 7、this.Dispose(); this.Dispose(True); this.Close(); GC.Collect(); 8、注意变量的作用域,具体说某个变量如果只是临时使用就不要定义成成员变量。GC是根据关系网去回收资源的。 9、检测是否存在内存泄漏的情况,详情可参见:内存泄漏百度百科 这里整理了一些网上关于Winform如何降低系统内存占用的资料,供参考: 1、使用性能测试工具dotTrace 3.0,它能够计算出你程序那些代码占用内存较多 2、强制垃圾回收 3、多dispose,close 4、用timer,每几秒钟调用:SetProcessWorkingSetSize(Process.GetCurrentProc... 最近我在项目写了几万行代码,小伙伴担心会让程序启动速度变慢,所以本渣就来做测试。 本渣使用了代码创建器,创建了 1000 个垃圾文件,这些文件都很简单。我将这些文件放在一个控制台项目里,没有做任何的引用,然后使用 dotTrace 测试控制台启动的时间。 我同时还写了一个空白的控制台项目,连输出都没有,请看代码 using System; using System.Diagnostics; namespace KejerbopaNekereyeresereJemayRouxouqou class Program static void Main(string[] args
在软件开发领域,测试驱动开发(Test Driven Development,TDD)技术在逐渐为广大开发者所接受,它是在添加新代码之前让你的测试代码出错的一种开发技术。在开始编写代码之前首先要写你的测试代码,然后再编写代码让你的测试通过,可以想象,如果没有一个好的单元测试工具,这项工作其实是无法完成的。相信很多.NET开发人员者对于开源的NUnit都不陌生,但是它并不能很好的与Visual Studio.NET IDE集成起来。 而 TestDriven.NET 是一款优秀的单元测试工具。它以插件的形式集成在Visual Studio.NET IDE的单元测试工具,能够兼容各种Visual Studio版本,并且集成了多种单元测试框架诸如NUnit,MbUnit,以及Visual Studio Team System适配器等。 TestDriven.NET的前身是NUnitAddIn,由Jamie Cansdale大师开发,一开始作者只是想做一个NUnit插件集成到Visual Studio,经过多次版本更新,NUnitAddIn在2004年9月底更名为TestDriven.NET,并在当年的12月初发布了它的第一个Release版本,即TestDriven.NET 1.0。由于它在开发的出色表现,让很多开发人员期待它的下一个版本的发布,这一等待却足足等了两年,在今年的10月底,终于迎来了姗姗来迟的TestDriven.NET 2.0版本。然而这一等待却是值得的,在2.0,给我们带来了太多的惊喜,它集成了.NET Reflector、NConver、NConverExplorer、TypeMock.NET等,功能更加强大,下面我将一一介绍TestDriven.NET 2.0涌现出的这些亮点。
1. 前言   看园子里面讲dotTrace 的文章不多,最近也有这方面的需要,于是去搜索了一下,.NET 性能分析方面的工具。目的呢,主要是想发现我的代码,哪些代码占用了最多时间,来进行优化。主要有两个工具,一个是Visual-Studio 2017自带的Performance Profiler 还有一个就是 DotTrace。 两者大概长成如下这样:首先是 Performance ...
2、强制垃圾回收 3、多dispose,close 4、用timer,每几秒钟调用:SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1);具体见附录。 5、发布的时候选择Release
当自己程序遇到性能问题,比如请求反应缓慢,怎么分析是哪里出了问题呢?dottrace可以帮助.net程序跟踪出代码里每个方法的执行时间,这样让我们更清晰的看出是哪里执行时间过长,然后再分析应该怎样解决Dottrace是由JetBrainshttp://www.jetbrains.com/ 公司开发的一款产品,它分dottrace Performance和dottrace Memory 两个工...
C# ,可以使用 .NET 框架自带的垃圾回收器(Garbage Collector)来自动管理内存。垃圾回收器会自动跟踪并清理不再使用的对象,从而避免内存泄漏的问题。但是,在某些情况下,可能会出现一些难以检测和解决的内存泄漏问题,因此需要采取一些措施来检测和解决内存泄漏。 下面是一些常用的检测内存泄漏的方法: 1. 使用性能分析器(Profiler):Visual Studio 自带性能分析器,可以帮助开发者定位内存泄漏问题。可以在代码执行过程,记录对象的创建和销毁情况,分析对象的引用关系,从而找出可能存在内存泄漏的问题。 2. 使用代码审查(Code Review):通过仔细阅读代码,查找可能导致内存泄漏的代码段。例如,没有正确释放资源、长时间持有对象的引用、循环引用等。 3. 使用内存分配跟踪工具:使用内存分配跟踪工具来记录和分析对象的创建和销毁情况,以及对象的引用关系。常用的工具有ANTS Memory Profiler、dotMemory、CLR Profiler 等。 4. 使用内存泄漏检测器:可以使用第三方内存泄漏检测器,例如 SciTech .NET Memory Profiler、dotTrace 等。这些工具可以自动检测内存泄漏问题,提供详细的报告和分析结果,方便开发者定位和解决问题。 总之,检测和解决内存泄漏需要开发者掌握一定的技能和经验。如果开发者能够遵循良好的编程习惯,并且使用适当的工具和技术,就可以避免和解决大部分的内存泄漏问题