8天玩转并行开发——第八天 用VS性能向导解剖你的程序

原文 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 Test8 {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         }

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

最后希望大家能够在此系列中获取一丝营养。

posted on 2014-02-10 21:08 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/3543530.html

8天玩转并行开发——第八天 用VS性能向导解剖你的程序相关推荐

  1. 8天玩转并行开发——第三天 plinq的使用

    8天玩转并行开发--第三天 plinq的使用 原文 8天玩转并行开发--第三天 plinq的使用 相信在.net平台下,我们都玩过linq,是的,linq让我们的程序简洁优美,简直玩的是爱不释手,但是 ...

  2. 8天玩转并行开发——第六天 异步编程模型

    原文:8天玩转并行开发--第六天 异步编程模型 在.net里面异步编程模型由来已久,相信大家也知道Begin/End异步模式和事件异步模式,在task出现以后,这些东西都可以被task包装 起来,可能 ...

  3. 8天玩转并行开发——第四天 同步机制(上)

    在并行计算中,不可避免的会碰到多个任务共享变量,实例,集合.虽然task自带了两个方法:task.ContinueWith()和Task.Factory .ContinueWhenAll()来实现任务 ...

  4. 8天玩转并行开发——第五天 同步机制(下)

    承接上一篇,我们继续说下.net4.0中的同步机制,是的,当出现了并行计算的时候,轻量级别的同步机制应运而生,在信号量这一块 出现了一系列的轻量级,今天继续介绍下面的3个信号量 CountdownEv ...

  5. 玩转mini2440开发板之【如何使用JLink下载烧录boot程序到NorFlash】

    一.工具及线束准备 1.准备一套Jlink V8(尽量使用这个版本的,其他版本没有验证过): 2.制作JTAG转接线,从Jlink下载器转至mini2440开发板的接口,如图1-3: 3.安装JLin ...

  6. 并行开发 4.同步机制(上)

    原文:8天玩转并行开发--第四天 同步机制(上) 在并行计算中,不可避免的会碰到多个任务共享变量,实例,集合.虽然task自带了两个方法:task.ContinueWith()和Task.Factor ...

  7. C#并行开发_Thread/ThreadPool, Task/TaskFactory, Parallel

    大家好,本次讨论的是C#中的并行开发,给力吧,随着并行的概念深入,哥也赶上这个潮流了,其实之前讨论C#的异步调用或者C#中BeginInvoke或者Invoke都已经涉及了部分本篇的内容. 参考书目: ...

  8. 探秘AI开发「神器」ModelArts,解读IoT 智能设备,华为云教你玩转 AI开发!

    11 月 14 日,DevRun 开发者沙龙华为云即将登陆上海.华为云技术大咖将带领开发者玩转 ModelArts,并解读华为云 IoT 服务与 AI 如何实现互通:聚焦华为云 ModelArts 和 ...

  9. 玩转mini2440开发板之【编译u-boot提示没有规则可以创建“XX.o”需要的目标】

    今天继续玩一玩mini2440开发板的u-boot的编译和下载. 首先,交代一下背景,我下载的是tekkamanninja大神于2010.03移植过来的mini2440定制版的u-boot(可以直接去 ...

最新文章

  1. 你,保持童心;我,帮你保持童颜
  2. 时间源服务器|授时仪|GPS时钟同步系统
  3. linux Shell(脚本)编程入门实例讲解详解
  4. C++11列表初始化
  5. 每一次突破都是一种进步
  6. 《操作系统真象还原》-阅读笔记(下)
  7. 佳能c3320如何u盘打印_佳能打印机脱机无法打印怎么办 佳能打印机脱机状态如何解除【详解】...
  8. 计算机前端学哪些好学,Web前端能干什么工作,好学吗
  9. 推荐几个我珍藏的公众号~超级无敌!
  10. SpringMVC前后台数据传递中Json格式的相互转换(前台显示格式、Json-lib日期处理)及Spring中的WebDataBinder浅析...
  11. 税控盘是服务器系统,税控盘系统参数设置服务器设置
  12. linux服务器网卡驱动安装,在linux下安装网卡驱动的方法
  13. oracle 索引快速全扫描,使用索引快速全扫描(Index FFS)避免全表扫描的若干场景
  14. 并行传输数据和串行传输数据_计算机系统中的并行处理和数据传输模式
  15. # 转:手机触屏触摸特效javascript-TouchSwipe(依赖于jquery库)中文说明
  16. 达人评测 i5 13500h和i5 12450h选哪个
  17. 数字化转型是新瓶装旧酒吗?
  18. 安卓多级列表的简单实现
  19. 小程序传布尔_拥抱和传布禅宗编码
  20. 基于内容的推荐算法(CB)

热门文章

  1. Linux solr 启动命令,linux – 重启Solr的正确方法是什么
  2. 粒子系统模拟-计算机图形学 豆瓣,基于粒子系统的瀑布模拟与实现
  3. java对docker_Java和Docker限制问题
  4. ei加声调怎么加_空调怎么加氟 空调加氟方法【介绍】
  5. 035_jdbc-mysql-dbutils的使用
  6. javascript同级遍历_有用的DOM遍历方法,你需要了解一下
  7. android 融云会话列表,为什么切换账号之后会话列表不刷新,还显示上一个帐号的内容?...
  8. MVC,MVP,MVVM设计模式的比较
  9. php生成唯一的加密串,hashids.php-master整数生成唯一字符串的加密库
  10. js时间搓化为今天明天_打乒乓球的搓球技巧!你掌握了吗?