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 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 }


最后我们发现,程序的执行时间确实加速了。不过这里面还有很多的东西等待挖掘,我也就简单的分析到此了。
最后希望大家能够在此系列中获取一丝营养。
8天玩转并行开发——第八天 用VS性能向导解剖你的程序的更多相关文章
- 并行开发 8.用VS性能向导解剖你的程序
原文:8天玩转并行开发——第八天 用VS性能向导解剖你的程序 最后一篇,我们来说说vs的“性能向导",通常我们调试程序的性能一般会使用Stopwatch,如果希望更加系统的了解程序,我们就需 ...
- 8天玩转并行开发——第三天 plinq的使用
原文 8天玩转并行开发——第三天 plinq的使用 相信在.net平台下,我们都玩过linq,是的,linq让我们的程序简洁优美,简直玩的是爱不释手,但是传统的linq只是串行代码,在并行的 年代如果 ...
- 8天玩转并行开发——第二天 Task的使用
原文 8天玩转并行开发——第二天 Task的使用 在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于 “任务的编程模型”所冲击, ...
- 8天玩转并行开发——第一天 Parallel的使用
转自:http://www.cnblogs.com/huangxincheng/archive/2012/04/02/2429543.html 随着多核时代的到来,并行开发越来越展示出它的强大威力,像 ...
- [转]8天玩转并行开发——第二天 Task的使用
在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于 “任务的编程模型”所冲击,因为task会比thread具有更小的性能开销,不 ...
- 并行开发学习随笔1——plinq并行
这两天在看园友的文章 <8天玩转并行开发——第三天 plinq的使用> 对里面的第一个实例亲手实践了一下,发现了一点有意思的事情. 测试环境:.net 4.5 64位(如果是32位的,测试 ...
- 并行开发 2.plink
原文:8天玩转并行开发——第二天 Task的使用 在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于 “任务的编程模型”所冲击, ...
- 并行开发 2.task
原文:8天玩转并行开发——第二天 Task的使用 在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于 “任务的编程模型”所冲击, ...
- 并行开发 1.Parallel
原文:8天玩转并行开发——第一天 Parallel的使用 随着多核时代的到来,并行开发越来越展示出它的强大威力,像我们这样的码农再也不用过多的关注底层线程的实现和手工控制, 要了解并行开发,需要先了解 ...
随机推荐
- main函数的参数问题 (转载)
void main(int arg ,char *arv[]){} arg -- 命令行参数总个数arv[0] -- 参数1,程序名 arv[1] -- 参数2,字符串 arv[2] -- 参数3,字 ...
- (Problem 10)Summation of primes
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below two milli ...
- Struts 2 OGNL
1.什么是OGNL? 2.Struts 2 OGNL 表达式 ====================== 华丽丽的分割线 ====================== 1.什么是OG ...
- jQuery特效手风琴特效 手写手风琴网页特效
今天写一个简单的手风琴效果,不用插件,利用强大的jQuery,写一个手风琴效果. 页面预览,请点击这里预览: 手风琴预览 案例分析: html结构 就是一个大盒子里面放着5个li,每个li的小小是2 ...
- 彻底理解浮动float CSS浮动详解 清除浮动的方法
我们把网页的常用的布局格式分为以下三种: 1.标准流. 所谓的标准流就是,行内元素自己单独一行,而块级元素是上下显示的. 以前我们学习的都是标准流. 注意:标准流使我们网页布局中最稳定的一种结构 ...
- 转:C++ 匿名namespace的作用以及它与static的区别
匿名namespace的作用以及它与static的区别 一.匿名namespace的作用在C语言中,如果我们在多个tu(translation unit)中使用了同一个名字做为函数名或者全局变量名,则 ...
- 基于visual Studio2013解决C语言竞赛题之0525拉丁方阵
题目
- (未解决)在JSTL中,session 和 sessionScope 有什么区别 ??
在JSP页面中,使用JSTL标签获取Session中的值并显示 为何当使用 ${session.user} 时,页面跳转后,第一次能够成功显示, 但是单击按钮重定向的时候,就获取不到了? 而使用 ${ ...
- Poj 2777 Count Color(线段树基础)
又毁三观了.......虽然题目数据有坑:区间[a,b]可能会有a>b的情况,但是我一开始没有考虑它也能过. 此外莫名其妙的TLE #include <iostream> #incl ...
- 关于ActionContext.getContext()的使用方法心得
这个也是我在另外一位仁兄的博客中看到的,原博客的有点长,我把它精简了一下,算看起来比較方便吧. 为了避免与Servlet API耦合在一起,方便Action类做单元測试,Struts 2对HttpSe ...