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

简介:

     最后一篇,我们来说说vs的“性能向导",通常我们调试程序的性能一般会使用Stopwatch,如果希望更加系统的了解程序,我们就需要

用到”性能向导“,通过性能报告便于我们快速的发现并找到潜在的性能问题。

 

首先我们上一段需要改进的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace Test
{
    class Program
    {
        static object obj = new object();

        static void Main(string[] args)
        {
            var watch = Stopwatch.StartNew();

            var range = ParallelEnumerable.Range(1, 100000000);

            var query = (from n in range.AsParallel()
                         where n % 5 == 0
                         select Calculate(n)).Average();

            watch.Stop();

            Debug.WriteLine("耗费时间:{0}", watch.Elapsed);
            Console.WriteLine("耗费时间:{0}", watch.Elapsed);
        }

        /// <summary>
        /// 模拟复杂的数学计算
        /// </summary>
        /// <param name="num"></param>
        /// <returns></returns>
        static double Calculate(int num)
        {
            lock (obj)
            {
                var sqrt = Math.Sqrt(num);

                var pow = Math.Pow(sqrt, 5);

                var log10 = Math.Log10(pow);

                var floor = Math.Floor(log10);

                return floor;
            }
        }
    }
}

记住,我们的程序需要改成Release版本,因为这里包含了太多的优化信息。

 

找到”工具栏”->"分析"->"启动性能向导",选中“并发”->"可视化多线程应用程序的行为"。

然后选中我们的程序Test

 

最后点击完成,如果是第一次使用的话会提示你“是否立即配置符号”,这是因为我们的并行计算用到了window函数,所以我们调试的时候

需要加载这些符号。点击“是”,然后勾选“MicroSoft符号服务器”,点击确定就OK了。

 

稍等一会,我们会看到三种视图:CPU使用率,线程,内核。

然后我们进入“CPU使用率”,看看情况。

从图中:我们可以获知如下信息:

①:从图中的绿色破浪线可以看出,我们的程序确实是多核计算。

②:并行计算耗时16515ms,平均CPU使用率:39%。,这里要注意,性能剖析器也需要耗费CPU周期,所以执行时间要稍大于实际时间。

 

然后,我们点击“线程“tab,看看效果

 

通过点击各个”线程”的绿色小条,然后看下“分析报告”:发现程序被三个task承载执行:主线程(644),辅助线程(4824),辅助线程(1564)。

 

然后我们点击“可见时间线分析”中的“同步”,看看同步是由谁贡献出来的,清楚的看到Monitor.Enter,这是因为我的代码里面有lock。

而且阻塞时间还是蛮厉害的,这里就是我们可以优化的点。

 

接下来,我们看看“核心”标签

这个标签给我们展示的是:各个线程是如何的映射到可用逻辑处理器内核的,具体的也没有什么好说的。

 

刚才也说了,我们程序的Monitor那一块是一个优化点,仔细论证代码,我们发现lock锁是多余的,接下来我们要做的事情就是去掉lock,

然后看看效果:


static double Calculate(int num)
        {
                var sqrt = Math.Sqrt(num);

                var pow = Math.Pow(sqrt, 5);

                var log10 = Math.Log10(pow);

                var floor = Math.Floor(log10);

                return floor;
        }

 

 

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

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


相关文章
|
6月前
|
数据可视化 数据库连接 测试技术
【软件设计师备考 专题 】编写外部设计文档:系统流程图和功能说明书
【软件设计师备考 专题 】编写外部设计文档:系统流程图和功能说明书
180 0
|
存储 前端开发 JavaScript
潮玩宇宙大逃杀无聊猿卷轴模式系统开发详细规则丨步骤需求丨方案项目丨技术架构丨源码功能
确定游戏类型和规则:明确无聊猿卷轴模式游戏类型和游戏规则,包括敌人类型、地图设计、任务类型、战斗机制等。
|
20天前
|
敏捷开发 数据可视化 算法
瀑布模型大揭秘:如何用分段式开发轻松搞定软件项目?
瀑布模型是软件开发中最早的线性开发方法,由Winston W. Royce于1970年提出。该模型将项目分为需求分析、系统设计、实现、集成与测试、部署和维护六个阶段,每个阶段自上而下依次进行。尽管近年来敏捷开发备受推崇,但瀑布模型在需求明确、流程复杂的项目中仍具重要价值。本文将详细介绍瀑布模型的概念、主要阶段及步骤,并探讨如何使用项目管理工具如板栗看板,帮助团队高效协作。
23 0
|
6月前
|
编解码 缓存 数据库
【软件设计师备考 专题 】编写内部设计文档:屏幕设计和数据库设计
【软件设计师备考 专题 】编写内部设计文档:屏幕设计和数据库设计
110 0
|
BI
PowerDesigner常用快捷键助你工作时迅速减半
PowerDesigner常用快捷键助你工作时迅速减半
153 0
|
程序员 Scala 开发者
项目需求和程序框架图 | 学习笔记
快速学习项目需求和程序框架图
项目需求和程序框架图 | 学习笔记
|
存储 JSON JavaScript
一款好用的Markdown编辑器及使用过程中的坑
一款好用的Markdown编辑器及使用过程中的坑
512 0
一款好用的Markdown编辑器及使用过程中的坑
|
数据库 Windows
艾伟:基于.NET平台的Windows编程实战(三)—— 项目的创建及主界面的设计
第一步:创建一个新的Windows项目 打开VS2005,点击“文件”-->“新建”-->“项目”,在弹出的对话框里,在左边选择“Windows”,在右边选择“Windows应用程序”,并在下面的名称里输入“QuestionnaireSystem”,选择相应的保存位置后,点“确定”,如下图3-1所示:                                  图3-1  这样一个新的Windows项目就创建好了。
751 0
|
数据库 Windows
艾伟_转载:基于.NET平台的Windows编程实战(三)—— 项目的创建及主界面的设计
第一步:创建一个新的Windows项目 打开VS2005,点击“文件”-->“新建”-->“项目”,在弹出的对话框里,在左边选择“Windows”,在右边选择“Windows应用程序”,并在下面的名称里输入“QuestionnaireSystem”,选择相应的保存位置后,点“确定”,如下图3-1所示:                                  图3-1  这样一个新的Windows项目就创建好了。
819 0
|
项目管理
从燃尽图看项目管理:你的项目哪里出错了?(燃尽图类型全解析)
从燃尽图看项目管理:你的项目哪里出错了?(燃尽图类型全解析)
8251 0