首页 > 其他分享 >【译】A unit of profiling makes the allocations go away

【译】A unit of profiling makes the allocations go away

时间:2023-10-23 09:05:18浏览次数:34  
标签:profiling return moduleString JmcState away 单元测试 else allocations 分配

  在 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/

 

 

 

标签:profiling,return,moduleString,JmcState,away,单元测试,else,allocations,分配
From: https://www.cnblogs.com/MeteorSeed/p/17749738.html

相关文章

  • 七张图看懂 Linux profiling 机制
    1图1Linuxprofiling手段一览软件埋点:手动埋点:主动调用trace函数来实现埋点。Androidsystrace即是这样一个例子,如图2和图3所示自动埋点:借助工具链,自动埋点,对函数的entry和return进行hook。Linuxftrace即是这样一个例子,图4简示了其实现原理动态埋......
  • 531_平台屏蔽太敏感?不如试试WordsAway
    这是一篇原发布于2020-06-1913:30:00得益小站的文章,备份在此处。前言本文提到的工具仅用于帮助发送正常的内容,只能避开机器检测,若有人举报,人工审核后可能遭至更严重的处罚!发布言论在公共平台时请注意自己的一言一行!虽然这是个好东西但是切勿滥用,不然到时候某一天算法可以识别......
  • 9-13|django.db.utils.OperationalError: (2006, 'Server has gone away') 报错
    `django.db.utils.OperationalError:(2006,'Serverhasgoneaway')`是一个与MySQL数据库连接相关的错误。这个错误通常发生在以下情境:1.**长时间的数据库连接**:当Django连接到数据库但长时间没有活动时,MySQL可能会关闭这个连接。当Django试图在一个已经被关闭的连接上......
  • PostgreSQL 源码性能诊断(perf profiling)指南(含火焰图生成分析FlameGraph) - 珍藏级
    PostgreSQL源码性能诊断(perfprofiling)指南(含火焰图生成分析FlameGraph)-珍藏级作者digoal日期2016-11-28标签PostgreSQL,Linux,perf,性能诊断,stap,systemtap,strace,dtrace,dwarf,profiler,perf_events,probe,dynamicprobe,tracepoint......
  • 数字基因表达谱(Digital Gene Expression Profiling,DGE)
    数字基因表达谱(DigitalGeneExpressionProfiling,DGE) 利用新一代高通量测序技术和高性能计算分析技术,能够全面、经济、快速地检测某一物种特定组织在特定状态下的基因表达情况。 数字基因表达谱已被广泛应用于基础科学研究、医学研究和药物研发等领域。 楼主应该是......
  • 性能测试Mysql之profiling参数
    一、查看profiling状态mysql>select@@profiling;0:表示为关闭1:表示开启二、开启profilingmysql>SETprofiling=1;三、showprofiles命令mysql>showprofiles;+----------+------------+--------------------------------------------+|Query_ID|Duration|......
  • 高效Python-2-1 剖析(Profiling 性能分析)
    2从内置功能中获取最高性能本章包括剖析代码以发现速度和内存瓶颈更有效地利用现有的Python数据结构了解Python分配典型数据结构的内存成本使用懒编程技术处理大量数据有很多工具和库可以帮助我们编写更高效的Python。但是,在我们深入研究提高性能的所有外部选项之前,让我......
  • 微擎开发使用workerman时,使用微擎pdo_xxx提示MySQL server has gone away解决办法
    微擎开发使用workerman时,使用微擎pdo_xxx提示MySQLserverhasgoneaway解决办法#找到微擎的DB类ramework\class\db.class.phppublicfunctionreConnect($errorInfo,$params){ if(in_array($errorInfo[1],array(1317,2013))){ $this->pdo=null; $this->conne......
  • 在 Spring Boot 中使用 Dataway 配置数据查询接口
     Dataway介绍Dataway是基于DataQL服务聚合能力,为应用提供的一个接口配置工具。使得使用者无需开发任何代码就配置一个满足需求的接口。整个接口配置、测试、冒烟、发布。一站式都通过Dataway提供的UI界面完成。UI会以Jar包方式提供并集成到应用中并和应用共享同......
  • 解决mysql数据库 ‘ MySQL server has gone away’
    参考:https://www.jianshu.com/p/8c8086c11cae原因:查询的结果集超过max_allowed_packet查看执行SQL执行文件大小是否超过max_allowed_packet,如果超过则需要调整参数,或者优化语句。解决:修改参数,max_allowed_packet,比如调整为28M。要大于执行的SQL文件大小setglobalmax_a......