.NET性能调优 ---- 使用Visual Studio进行代码度量

.NET性能调优系列文章

系列文章索引

使用Visual Studio进行代码度量

在这篇文章里,暂且抛开代码、数据库和网络的优化,从软件代码度量的角度来看看其对.NET性能调优的作用。

当软件项目异常庞大的时候,通过简单的CodeReview进行软件复杂度估量和可靠性评测已经变得不太现实,还好有软件来完成这些事情。降低软件的复杂度也会对性能调优带来很大的帮助。

在Visual Studio 2008前,进行代码度量还要借助第三方的一些工具,如devMetricsC# Source Code Metrics等,而从Visual Studio 2008开始微软就在里面集成了代码度量的工具。

点击Visual Studio的“分析”菜单,可以看到度量工具能够针对当前项目或者整个解决方案进行代码度量。

下拉菜单的上面还有和第一篇文章里介绍的ANTS Performance Profiler类似的代码性能分析工具,简单使用了下,发现当要查看.NET框架内部实现的耗能时是看不到的,其他的功能基本能满足需求,感谢园友风云的提醒。

短暂运行后,就可以看到分析的结果。

这里列出了所有能计算出来的列,下面是MSDN对计算结果值意义的说明。

  1. 层次结构:按照项目-命名空间-类-属性/方法进行逐级细分,所以可以只针对某一个方法查看相关的代码度量值。
  2. 可维护性指数:计算一个介于 0 和 100 之间的指数值,表示维护代码的相对容易度。 值越大表示可维护性越好。 彩色图标的等级可用来快速识别代码中的故障点。 绿色等级介于 20 和 100 之间,表示代码的可维护性良好。 黄色等级介于 10 和 19 之间,表示代码的可维护性中等。 红色等级是介于 0 和 9 之间的等级,表示可维护性低。
  3. 圈复杂度:衡量代码在结构上的复杂程度。 通过计算程序流中的不同代码路径数而创建的。 具有复杂控制流的程序需要更多测试才能实现良好的代码覆盖率,并且不容易维护。在某些情况下,Visual Studio 2010 中的方法的圈复杂度计算与早期版本有所不同,具体参见Visual Studio 2010 在代码复杂度计算方面所做的更改
  4. 继承深度:指明扩展到类层次结构根的类定义的数目。 层次结构越深,则越难了解特定方法和字段是在何处定义或/和重新定义的。
  5. 类耦合:通过参数、局部变量、返回类型、方法调用、泛型或模板实例化、基类、接口实现、在外部类型上定义的字段以及特性修饰来衡量与唯一类的耦合程度。 良好的软件设计要求类型和方法应具有较高的内聚力和较低的耦合。 耦合较高表示设计难以重用和维护,这是因为它与其他类型之间存在许多依存关系。
  6. 代码的行数:指明代码中的大概行数。 该计数基于 IL 代码,因此并不是源代码文件中的确切行数。 计数过高可能表示某个类型或方法正在尝试执行过多的工作,应予以拆分。 还可能表示该类型或方法难以维护。

最需要关注的可能就是圈复杂度和类耦合两个度量值了,以使得程序保持高类聚低耦合;如果圈复杂度过高,应该将函数拆解,这样在进行性能调优时可以逐个击破,维护起来也比较容易。

结语

希望在探讨程序性能调优时别忘记先将软件的复杂度和可维护性降低一些,这样在遇到复杂的性能优化问题时,思路才能足够清晰,可以将精力集中在细分后的代码段上,而不是有太多的代码噪音来干扰逻辑的梳理与思考。

所以这个系列文章先将这部分内容拿到了第二篇里来和大家一起探讨了。

文章有所疏漏和要补充的,请留言一起讨论,也请关注后续的相关文章。

如果文章对你有点帮助,推荐一下吧,谢谢 :)

 

 

出处:https://www.cnblogs.com/parry/archive/2013/01/06/DotNet_Performance_Tuning_Code_Metrics.html

=======================================================================================

通过 Visual Studio 的“代码度量值”来改进代码质量

1 软件度量值指标

1.1 可维护性指数

  表示源代码的可维护性,数值越高可维护性越好。该值介于0到100之间。绿色评级在20到100之间,表明该代码具有高度的可维护性;黄色评级在10到19之间,表示该代码适度可维护;红色评级在0至9之间,表示低可维护性。

1.2 圈复杂度

   它是通过计算程序流中不同代码路径的数量来创建的,用来表示一个程序的复杂性。具有复杂控制流的程序需要更多的测试才能获得良好的代码覆盖率,并且不易维护。

  以下两种情况会在计算圈复杂度时加1:

  •   分支(if、while、do)
  •   switch中的case语句  

  例如:

复制代码
    //圈复杂度1
    public void Method()
    {
        Console.WriteLine("Hello World!");
    }

    //圈复杂度3
    public void Method(bool condition1, bool condition2)
    {
        if (condition1 || condition2)
        {
            Console.WriteLine("Hello World!");
        }
    }

    //圈复杂度8
    public void Method(DayOfWeek day)
    {

        switch (day)
        {
            case DayOfWeek.Monday:
                Console.WriteLine("Today is Monday!");
                break;
            case DayOfWeek.Tuesday:
                Console.WriteLine("Today is Tuesday!");
                break;
            case DayOfWeek.Wednesday:
                Console.WriteLine("Today is Wednesday!");
                break;
            case DayOfWeek.Thursday:
                Console.WriteLine("Today is Thursday!");
                break;
            case DayOfWeek.Friday:
                Console.WriteLine("Today is Friday!");
                break;
            case DayOfWeek.Saturday:
                Console.WriteLine("Today is Saturday!");
                break;
            case DayOfWeek.Sunday:
                Console.WriteLine("Today is Sunday!");
                break;
        }
    }
复制代码

 

1.3 继承深度

  计算在继承层次结构中的继承深度,继承树中层次结构越深,类的开发、测试和维护就越复杂,因为层次结构越深,理解特定方法和字段的定义和(或)重新定义的难度也就越大。

1.4 类耦合度

  类耦合是一个类是如何与另一个类连接或依赖的度量。好的做法是总是实现较少的依赖类或低级耦合。

1.5 代码行数

  表示代码行数,计数基于IL代码,因此不是源代码文件中的确切行数。一个非常高的计数可能表明一种类型或方法试图做太多的工作,应该分开。它还可能表明类型或方法可能难以维护。

2 计算代码度量值

 Step 01 运行“计算代码度量值”

Step 02 查看“代码度量值结果”

Step 03 使用“代码度量值结果”

  筛选:

  导出:

 

  列管理:

   计算代码度量值:

 

参考文档:https://www.codeguru.com/csharp/csharp/cs_network/improving-code-quality-with-visual-studio-code-metrics.html

 

 

出处:https://www.cnblogs.com/MeteorSeed/p/7865426.html

posted on 2020-12-30 13:53  jack_Meng  阅读(330)  评论(0编辑  收藏  举报

导航