zoukankan      html  css  js  c++  java
  • 8天玩转并行开发——第八天 用VS性能向导解剖你的程序

       最后一篇,我们来说说vs的“性能向导",通常我们调试程序的性能一般会使用Stopwatch,如果希望更加系统的了解程序,我们就需要

    用到”性能向导“,通过性能报告便于我们快速的发现并找到潜在的性能问题。

    首先我们上一段需要改进的代码:

    复制代码
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Diagnostics;
     6 
     7 namespace Test
     8 {
     9     class Program
    10     {
    11         static object obj = new object();
    12 
    13         static void Main(string[] args)
    14         {
    15             var watch = Stopwatch.StartNew();
    16 
    17             var range = ParallelEnumerable.Range(1, 100000000);
    18 
    19             var query = (from n in range.AsParallel()
    20                          where n % 5 == 0
    21                          select Calculate(n)).Average();
    22 
    23             watch.Stop();
    24 
    25             Debug.WriteLine("耗费时间:{0}", watch.Elapsed);
    26             Console.WriteLine("耗费时间:{0}", watch.Elapsed);
    27         }
    28 
    29         /// <summary>
    30         /// 模拟复杂的数学计算
    31         /// </summary>
    32         /// <param name="num"></param>
    33         /// <returns></returns>
    34         static double Calculate(int num)
    35         {
    36             lock (obj)
    37             {
    38                 var sqrt = Math.Sqrt(num);
    39 
    40                 var pow = Math.Pow(sqrt, 5);
    41 
    42                 var log10 = Math.Log10(pow);
    43 
    44                 var floor = Math.Floor(log10);
    45 
    46                 return floor;
    47             }
    48         }
    49     }
    50 }
    复制代码

    记住,我们的程序需要改成Release版本,因为这里包含了太多的优化信息。

    找到”工具栏”->"分析"->"启动性能向导",选中“并发”->"可视化多线程应用程序的行为"。

    然后选中我们的程序Test

    最后点击完成,如果是第一次使用的话会提示你“是否立即配置符号”,这是因为我们的并行计算用到了window函数,所以我们调试的时候

    需要加载这些符号。点击“是”,然后勾选“MicroSoft符号服务器”,点击确定就OK了。

    稍等一会,我们会看到三种视图:CPU使用率,线程,内核。

    然后我们进入“CPU使用率”,看看情况。

    从图中:我们可以获知如下信息:

    ①:从图中的绿色破浪线可以看出,我们的程序确实是多核计算。

    ②:并行计算耗时16515ms,平均CPU使用率:39%。,这里要注意,性能剖析器也需要耗费CPU周期,所以执行时间要稍大于实际时间。

    然后,我们点击“线程“tab,看看效果

    通过点击各个”线程”的绿色小条,然后看下“分析报告”:发现程序被三个task承载执行:主线程(644),辅助线程(4824),辅助线程(1564)。

    然后我们点击“可见时间线分析”中的“同步”,看看同步是由谁贡献出来的,清楚的看到Monitor.Enter,这是因为我的代码里面有lock。

    而且阻塞时间还是蛮厉害的,这里就是我们可以优化的点。

    接下来,我们看看“核心”标签

    这个标签给我们展示的是:各个线程是如何的映射到可用逻辑处理器内核的,具体的也没有什么好说的。

    刚才也说了,我们程序的Monitor那一块是一个优化点,仔细论证代码,我们发现lock锁是多余的,接下来我们要做的事情就是去掉lock,

    然后看看效果:

    复制代码
     1         static double Calculate(int num)
     2         {
     3                 var sqrt = Math.Sqrt(num);
     4 
     5                 var pow = Math.Pow(sqrt, 5);
     6 
     7                 var log10 = Math.Log10(pow);
     8 
     9                 var floor = Math.Floor(log10);
    10 
    11                 return floor;
    12         }
    复制代码

    最后我们发现,程序的执行时间确实加速了。不过这里面还有很多的东西等待挖掘,我也就简单的分析到此了。

  • 相关阅读:
    一个晚上加一个上午啊 笨死算球
    转来的——python webdriver自动化测试初步印象——转来的
    MySQL软件升级
    创建rhel7基础镜像
    SHELL-收集Oracle已应用的PSU信息
    rhel7.6上安装Oracle 19.2.0.0 RAC
    AIX平台安装Oracle11gR2数据库
    Oracle Database(rdbms) 12.2 安装组件
    HP-UX平台安装Oracle11gR2数据库
    Linux平台安装Oracle11gR2数据库
  • 原文地址:https://www.cnblogs.com/Jeely/p/10999368.html
Copyright © 2011-2022 走看看