原文: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 }

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

最新文章

  1. Sublime Text 3 支持的热门插件推荐
  2. 转!!java事务的处理
  3. 3年的坚持,最终造就著作——《Learninghard C#学习笔记》
  4. wxpython更新
  5. HashMap实现原理分析
  6. python pip install
  7. Atitit.如何避免公司破产倒闭的业务魔咒
  8. JSP 标准标签库(JSTL)之最常用的JSTL标签总结
  9. 无法启动T-SQL 调试
  10. livevent的几个问题
  11. Qt 鼠标样式特效探索样例(一)——利用时间器调用QWidget.move()函数
  12. boostrap-非常好用但是容易让人忽略的地方------modal
  13. linux 增量备份命令Rsync 使用详解
  14. 2、各种折腾,安装交叉环境的gcc和qt,测试c++和qt程序
  15. hdu1698 Just a Hook 线段树
  16. haproxy反向代理配置示例
  17. Oracle RMAN备份与还原
  18. KNN算法的R语言实现
  19. 不规则形状的Mask动画
  20. U盘安装window系统

热门文章

  1. 02tensorflow非线性回归以及分类的简单实用,softmax介绍
  2. bzoj4940 [Ynoi2016]这是我自己的发明 莫队+dfs序
  3. python NameError: name &#39;file&#39; is not defined
  4. PCA(基础知识)
  5. u盘被占用,无法弹出解决办法
  6. 阿里云Serverless应用引擎(SAE)3大核心优势全解析
  7. B/S选择文件夹上传
  8. [USACO2011 Feb]Best Parenthesis
  9. Android中对Apk加固(加壳)续篇之---对Native层(so文件)进行加固
  10. TabController定义顶部tab切换