【译】A unit of profiling makes the allocations go away
在 Visual Studio 17.8 Preview 2 中,我们更新了单元测试分析,允许你在性能分析器中使用任何可用的工具——而不仅仅是仪表工具。有了这个更改,可以很容易地快速分析孤立的小工作单元,进行更改,然后重新度量和验证更改的影响。假设您有良好的测试覆盖率,这是利用现有资产来帮助优化应用程序性能的好方法。
谁动了我的奶酪?
在这个新版本中,我们更新了单元测试分析体验。以前,当在单元测试上下文菜单中选择 profile 时,它在 Instrumentation 工具下运行,并且您在运行结束时得到报告。

现在,当您选择一个 profile 时,Performance Profiler 启动页面将出现,您可以选择任何可用的工具。

这让您可以使用 .NET Object Allocation 工具来分析单元测试,以查看所有的分配以及它们来自哪里。这是减少不必要的分配并验证更改的好方法。
让我们减少一些分配吧!
现在我们可以使用任何工具了,让我们花5分钟看看我们是否可以从性能分析器中减少一些分配。首先,我有一个名为“VerifySimpleCallTree”的单元测试,我们使用它来验证我们的分析器是否正确地构建了一个调用树。在测试资源管理器中,我右键单击测试并选择“Profile”,得到 Performance Profiler,选择 .NET Object Allocation 工具,然后点击“Start”。从这里开始我的测试运行,一旦完成,我就会得到正常的分配报告,我可以用它来深入研究分配,看看我可以削减什么来减轻 GC 的负担。

当我浏览这些类型时,我注意到分配了一堆 Enumerators 。虽然这不是直接错误,但它确实看起来很奇怪。通过回溯,我可以看到这是来自我们的 JmcConfigurationService,并且查看代码,可以肯定枚举器是从 Any() 扩展方法创建的。
this.patternsLock.EnterReadLock();
try
{
if (this.unknownModulePatterns.Any(t => t.IsMatch(moduleString)))
{
return JmcState.UnknownCode;
}
else if (this.systemModulePatterns.Any(t => t.IsMatch(moduleString)))
{
return JmcState.SystemCode;
}
else
{
return IsStringJmc(moduleString, this.excModulePatterns, this.incModulePatterns) ? JmcState.UserCode : JmcState.LibraryCode;
}
}
finally
{
this.patternsLock.ExitReadLock();
}
通过使用静态局部函数快速重写,我们可以删除枚举数并减少分配。
this.patternsLock.EnterReadLock();
try
{
if (CheckMatch(this.unknownModulePatterns, moduleString))
{
return JmcState.UnknownCode;
}
else if (CheckMatch(this.systemModulePatterns, moduleString))
{
return JmcState.SystemCode;
}
else
{
return IsStringJmc(moduleString, this.excModulePatterns, this.incModulePatterns) ? JmcState.UserCode : JmcState.LibraryCode;
}
}
finally
{
this.patternsLock.ExitReadLock();
} static bool CheckMatch(List patterns, string moduleStr)
{
foreach (var pattern in patterns)
{
if (pattern.IsMatch(moduleStr))
{
return true;
}
} return false;
}
在单元测试上重新运行分析器,我可以验证并结果:实际上,我已经删除了这些不必要的分配,并帮助减少了 GC 的负担。

虽然这个小调整不会让我的应用神奇地快20%,但随着时间的推移慢慢减少不必要的分配是逐步提高应用性能的好方法。有了新的单元测试分析,就可以很容易地处理现有的测试资产,然后验证更改是否产生了预期的影响。
让我们知道你的想法!
使用单元测试进行独立性能分析的能力令人敬畏。通过隔离特定的代码区域,很容易获得良好的前后跟踪,以比较和查看性能优化的影响。我们热切欢迎任何聪明的想法,看法,或有价值的见解,我们洗耳恭听!不要隐瞒,请随时与我们分享吧。
原文链接:https://devblogs.microsoft.com/visualstudio/a-unit-of-profiling-makes-the-allocations-go-away/

【译】A unit of profiling makes the allocations go away的更多相关文章
- 【译】Database Profiling with Visual Studio
你是否在排查运行缓慢的 web 应用程序时怀疑是数据库层造成的?以前排查数据库层需要特定的工具,现在可以使用 Visual Studio 的 Performance Explorer 中的数据库分析工 ...
- 【译】Android API 规范
[译]Android API 规范 译者按: 修改R代码遇到Lint tool的报错,搜到了这篇文档,aosp仓库地址:Android API Guidelines. 58e9b5f Project ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- 解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译)
解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译) http://improve.dk/orcamdf-rawdatabase-a-swiss-a ...
- 解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译)
解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译) http://improve.dk/corrupting-databases-purpose-usin ...
- [译]使用Continuous painting mode来分析页面的绘制状态
Chrome Canary(Chrome “金丝雀版本”)目前已经支持Continuous painting mode,用于分析页面性能.这篇文章将会介绍怎么才能页面在绘制过程中找到问题和怎么利用这个 ...
- 配置SQL Server去使用 Windows的 Large-Page/Huge-Page allocations
配置SQL Server去使用 Windows的 Large-Page/Huge-Page allocations 目录表->页表->物理内存页 看这篇文章之前可以先看一下下面这篇文章 ...
- 怎么监视跟踪一个进程(Process)中的MS Unit Test DLL的详细性能(performance)【asp.net C#】
Sample This tutorial will show how to instrument a unit test DLL for performance profiling. Visual S ...
- TCP传输小数据包效率问题(译自MSDN)
TCP传输小数据包效率问题(译自MSDN) http://www.ftpff.com/blog/?q=node/16 摘要:当使用TCP传输小型数据包时,程序的设计是相当重要的.如果在设计方案中不对T ...
- QT unit test code coverage
准备环境: qt-creator5.2.1 , gcov(gcc 默认安装),lcov(gcov 的图形化显示界面),qt_testlib 各环境介绍: 1.gcov gcov 是一个可用于C/C ...
随机推荐
- Truncate 和 Delete 的区别与选择
1)事务和日志 delete 语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行回滚操作. truncate table 则 一次性地从表中删除所有 ...
- GSAP 基础
GreenSock Animation Platform (GSAP) 是一个业界知名的动画库,它被1100多万个网站使用,有超过50%的获奖的网站都是用了它.不管是在原生环境中,还是任意的框架中,你 ...
- UPS设备在物流机房中的应用浅析
1 UPS 简介 UPS 即不间断电源 (Uninterruptible Power Supply),是一种含有储能装置的不间断电源.主要用于给部分对电源稳定性要求较高的设备,提供不间断的电源. 当市 ...
- .Net Core控制台程序读取Json配置文件
1 添加依赖(可以直接通过nuget包安装 Microsoft.Extensions.Configuration.Json 这个会依赖其他两个会自动安装依赖的) Microsoft.Extension ...
- 【Go blog】Govulncheck v1.0.0 发布了!
我们很高兴地宣布,govulncheck v1.0.0 已经发布,同时也发布了用于集成扫描到其他工具的 API 的 v1.0.0 版本!Go 对漏洞管理的支持首次在去年九月宣布.从那时起,我们做了一些 ...
- 数据处理的那些事「GitHub 热点速览」
撇开一屏占四分之三屏幕的 AI 相关项目之外,本周剩下的热榜项目就是同数据有关的数据库项目,比如 CockroachDB 团队开源的 kv 存储数据库 pebble,旨在提供高性能的消息队列 blaz ...
- uniapp 只选择月份与日的时间选择器
1.使用 <picker> 组件的 mode 属性设置为 "multiSelector",然后通过设置 range 属性来提供可选的月份和日的列表. <templ ...
- .NET Core多线程 (2) 异步 - 上
去年换工作时系统复习了一下.NET Core多线程相关专题,学习了一线码农老哥的<.NET 5多线程编程实战>课程,我将复习的知识进行了总结形成本专题. 本篇,我们来复习一下异步的相关知识 ...
- 缓存面试解析:穿透、击穿、雪崩,一致性、分布式锁、Redis过期,海量数据查找
为什么使用缓存 在程序内部使用缓存,比如使用map等数据结构作为内部缓存,可以快速获取对象.通过将经常使用的数据存储在缓存中,可以减少对数据库的频繁访问,从而提高系统的响应速度和性能.缓存可以将数据保 ...
- 从浅入深了解.NET Core MVC 2.x全面教程【第二章】
二.Logging 1.诊断中间件 命名空间:Microsoft.AspNetCore.Diagnostics 报告信息并处理异常 2.诊断中间件 UseDeveloperExceptionPage: ...