并行开发8——用VS性能向导解剖你的程序
来源:互联网 发布:淘宝logo设计 编辑:程序博客网 时间:2024/04/29 06:52
用到”性能向导“,通过性能报告便于我们快速的发现并找到潜在的性能问题。
首先我们上一段需要改进的代码:
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 Program10 {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 == 021 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开发问题:应用程序无法启动 因为程序的并行配置不正确 ,解决方案
- VS自定义开发向导中的vsdir文件的简单说明
- {SmartAssembly} – 混淆你的程序集代码使用向导
- 让你的程序“飞”起来——性能优化
- 解剖常用软件程序都用什么语言开发
- 向导界面的开发
- 多核下写高性能并行程序
- VS中创建自定义一个VC工程为基础的开发向导的总结
- Java性能调优_深入Java程序性能调优(并行开发、JVM调优)
- 深入浅出WPF(2)——解剖最简单的GUI程序
- 深入浅出WPF(2)——解剖最简单的GUI程序
- 让你的.NET程序脱离Framework跑起来---3.解剖.NET Framework
- 关于VS的MFC应用程序向导
- TR069协议向导——一个帮助你了解TR069协议的简明教程(一)
- TR069协议向导—— 一个帮助你了解TR069协议的简明教程(二)
- 并行开发4——同步机制(上)
- 并行开发4——同步机制(下)
- 并行开发5——异步编程模型
- python进制转换
- 并行开发7——简要分析任务与线程池
- 并行开发8——用VS性能向导解剖你的程序
- hdu 4533
- WCF Web API 轻松实现 REST
- 抛弃WebService,在.NET4中用 jQuery 调用 WCF
- jQuery调用WCF服务时如何传递对象参数
- jQuery调用WCF需要注意的一些问题
- 2013年最值得投资的移动支付项目
- 搭建一个后台服务器--服务端(异步,大并发)
- Java Binary Search