zoukankan      html  css  js  c++  java
  • 并行开发 —— 第八篇 用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 学习日记 第七天
    Python 学习日记 第六天
    Python 学习日记 第五天
    Python 学习日记 第四天
    Redis 中的数据类型及基本操作
    Asp.net mvc 中View 的呈现(二)
    Asp.net mvc 中View的呈现(一)
    Asp.net mvc 中Action 方法的执行(三)
    Asp.net mvc 中Action 方法的执行(二)
    Asp.net mvc 中Action 方法的执行(一)
  • 原文地址:https://www.cnblogs.com/ShaYeBlog/p/2682126.html
Copyright © 2011-2022 走看看