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 }
最后我们发现,程序的执行时间确实加速了。不过这里面还有很多的东西等待挖掘,我也就简单的分析到此了。
最后希望大家能够在此系列中获取一丝营养。
转载于:https://www.cnblogs.com/lonelyxmas/p/3543530.html
8天玩转并行开发——第八天 用VS性能向导解剖你的程序相关推荐
- 8天玩转并行开发——第三天 plinq的使用
8天玩转并行开发--第三天 plinq的使用 原文 8天玩转并行开发--第三天 plinq的使用 相信在.net平台下,我们都玩过linq,是的,linq让我们的程序简洁优美,简直玩的是爱不释手,但是 ...
- 8天玩转并行开发——第六天 异步编程模型
原文:8天玩转并行开发--第六天 异步编程模型 在.net里面异步编程模型由来已久,相信大家也知道Begin/End异步模式和事件异步模式,在task出现以后,这些东西都可以被task包装 起来,可能 ...
- 8天玩转并行开发——第四天 同步机制(上)
在并行计算中,不可避免的会碰到多个任务共享变量,实例,集合.虽然task自带了两个方法:task.ContinueWith()和Task.Factory .ContinueWhenAll()来实现任务 ...
- 8天玩转并行开发——第五天 同步机制(下)
承接上一篇,我们继续说下.net4.0中的同步机制,是的,当出现了并行计算的时候,轻量级别的同步机制应运而生,在信号量这一块 出现了一系列的轻量级,今天继续介绍下面的3个信号量 CountdownEv ...
- 玩转mini2440开发板之【如何使用JLink下载烧录boot程序到NorFlash】
一.工具及线束准备 1.准备一套Jlink V8(尽量使用这个版本的,其他版本没有验证过): 2.制作JTAG转接线,从Jlink下载器转至mini2440开发板的接口,如图1-3: 3.安装JLin ...
- 并行开发 4.同步机制(上)
原文:8天玩转并行开发--第四天 同步机制(上) 在并行计算中,不可避免的会碰到多个任务共享变量,实例,集合.虽然task自带了两个方法:task.ContinueWith()和Task.Factor ...
- C#并行开发_Thread/ThreadPool, Task/TaskFactory, Parallel
大家好,本次讨论的是C#中的并行开发,给力吧,随着并行的概念深入,哥也赶上这个潮流了,其实之前讨论C#的异步调用或者C#中BeginInvoke或者Invoke都已经涉及了部分本篇的内容. 参考书目: ...
- 探秘AI开发「神器」ModelArts,解读IoT 智能设备,华为云教你玩转 AI开发!
11 月 14 日,DevRun 开发者沙龙华为云即将登陆上海.华为云技术大咖将带领开发者玩转 ModelArts,并解读华为云 IoT 服务与 AI 如何实现互通:聚焦华为云 ModelArts 和 ...
- 玩转mini2440开发板之【编译u-boot提示没有规则可以创建“XX.o”需要的目标】
今天继续玩一玩mini2440开发板的u-boot的编译和下载. 首先,交代一下背景,我下载的是tekkamanninja大神于2010.03移植过来的mini2440定制版的u-boot(可以直接去 ...
最新文章
- 你,保持童心;我,帮你保持童颜
- 时间源服务器|授时仪|GPS时钟同步系统
- linux Shell(脚本)编程入门实例讲解详解
- C++11列表初始化
- 每一次突破都是一种进步
- 《操作系统真象还原》-阅读笔记(下)
- 佳能c3320如何u盘打印_佳能打印机脱机无法打印怎么办 佳能打印机脱机状态如何解除【详解】...
- 计算机前端学哪些好学,Web前端能干什么工作,好学吗
- 推荐几个我珍藏的公众号~超级无敌!
- SpringMVC前后台数据传递中Json格式的相互转换(前台显示格式、Json-lib日期处理)及Spring中的WebDataBinder浅析...
- 税控盘是服务器系统,税控盘系统参数设置服务器设置
- linux服务器网卡驱动安装,在linux下安装网卡驱动的方法
- oracle 索引快速全扫描,使用索引快速全扫描(Index FFS)避免全表扫描的若干场景
- 并行传输数据和串行传输数据_计算机系统中的并行处理和数据传输模式
- # 转:手机触屏触摸特效javascript-TouchSwipe(依赖于jquery库)中文说明
- 达人评测 i5 13500h和i5 12450h选哪个
- 数字化转型是新瓶装旧酒吗?
- 安卓多级列表的简单实现
- 小程序传布尔_拥抱和传布禅宗编码
- 基于内容的推荐算法(CB)
热门文章
- Linux solr 启动命令,linux – 重启Solr的正确方法是什么
- 粒子系统模拟-计算机图形学 豆瓣,基于粒子系统的瀑布模拟与实现
- java对docker_Java和Docker限制问题
- ei加声调怎么加_空调怎么加氟 空调加氟方法【介绍】
- 035_jdbc-mysql-dbutils的使用
- javascript同级遍历_有用的DOM遍历方法,你需要了解一下
- android 融云会话列表,为什么切换账号之后会话列表不刷新,还显示上一个帐号的内容?...
- MVC,MVP,MVVM设计模式的比较
- php生成唯一的加密串,hashids.php-master整数生成唯一字符串的加密库
- js时间搓化为今天明天_打乒乓球的搓球技巧!你掌握了吗?