性能和性能分析

性能分析是指观察和记录有关应用程序行为的度量的过程。常见的性能问题源于运行速度慢或低效的代码,或者导致内存浪费的代码。

大多数性能分析工具都可以归为:

  采样式:采样式性能分析器通过获取运行应用程序的周期性快照(称为采样),记录每个时间间隔内的应用程序运行状态,包括正在执行的代码行。通常情况下,不会修改被测系统代码,而倾向于采用外部透视方法。
  插装式:采用侵入式方案。

两者的主要区别在于,采样式分析器在运行任何代码时都会检查应用程序,包括对外部库的调用。而插装式分析器则只从插装代码收集数据。

Visual Studio的性能分析工具对托管和非托管应用程序均适用,但对象分配跟踪功能只对托管代码有效。

使用Visual Studio对应用程序进行性能分析主要有4个步骤:

  创建性能会话,选择性能分析方法(CPU采样、插装、内存采样或并发)及其目标
  使用Performance Explorer浏览和设置会话属性
  发起会话,执行应用程序和性能分析器
  审查性能报告中收集的数据。

创建实例应用程序:

1. 创建WidgetClass.cs文件,代码如下:

 1 namespace DemoConsole
 2 {
 3     public class WidgetClass
 4     {
 5         private string _name;
 6         public string Name
 7         {
 8             get { return _name; }
 9             set { _name = value; }
10         }
11
12         private int _id;
13         public int Id
14         {
15             get { return _id; }
16             set { _id = value; }
17         }
18         public WidgetClass(int id, string name)
19         {
20             _id = id;
21             _name = name;
22         }
23     }
24 }

2. 创建WidgetValueType.cs文件,代码如下:

 1 namespace DemoConsole
 2 {
 3     public struct WidgetValueType
 4     {
 5         private string _name;
 6         public string Name
 7         {
 8             get { return _name; }
 9             set { _name = value; }
10         }
11
12         private int _id;
13         public int Id
14         {
15             get { return _id; }
16             set { _id = value; }
17         }
18         public WidgetValueType(int id, string name)
19         {
20             _id = id;
21             _name = name;
22         }
23     }
24 }

3. 在Program.cs文件中添加代码如下:

 1 using System.Collections;
 2
 3 namespace DemoConsole
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             ProcessClasses(2000000);
10             ProcessValueTypes(2000000);
11         }
12
13         public static void ProcessClasses(int count)
14         {
15             ArrayList widgets = new ArrayList();
16             for (int i = 0; i < count; i++)
17             {
18                 widgets.Add(new WidgetClass(i, "Test"));
19             }
20             string[] names = new string[count];
21             for (int i = 0; i < count; i++)
22             {
23                 names[i] = ((WidgetClass)widgets[i]).Name;
24             }
25         }
26
27         public static void ProcessValueTypes(int count)
28         {
29             ArrayList widgets = new ArrayList();
30             for (int i = 0; i < count; i++)
31             {
32                 widgets.Add(new WidgetValueType(i, "Test"));
33             }
34             string[] names = new string[count];
35             for (int i = 0; i < count; i++)
36             {
37                 names[i] = ((WidgetValueType)widgets[i]).Name;
38             }
39         }
40     }
41 }

在对应用程序进行性能分析之前,首先需要创建一个性能会话,利用Performance Wizard创建会话,在其中确定一系列最常用的设置,也可以创建一个空的性能会话,或以某个单元测试结果为基础创建性能会话。

使用Performance Wizard

在VS2013的菜单栏上点击ANALYZE-->Performance and Diagnostics打开会话,选择Performance Wizard复选框,点击Start按钮,打开Performance Wizard:

选择默认选项,下一步,选择要分析的应用程序,然后完成。

添加空的性能会话

通过ANALYZE| Profiler| New Performance Session创建一个空的性能会话。然后手动指定会话的分析模式、目标和设置等。

从单元测试中创建性能会话

在VS2010中可以通过单元测试创建性能会话,首先要执行该单元测试,然后再Test Results窗口中右击该测试在上下文菜单中选择Create Performance Session即可。

创建了性能会话之后,就可以通过Performance Explorer对其进行浏览,Performance Explorer可以用于配置和执行性能会话,以及浏览性能会话结果。

在Performance Explorer中有两个目录:Targets用于指定会话执行时所分析的应用程序对象。Reports用于列出当前会话每次执行时的结果。

无论使用哪种方式创建会话,都需要查看和修改其中的设置,右击会话名选择属性:

采样分析是对应用程序进行性能分析的轻量级方法,它会周期性地中断目标程序的执行,记录正在执行的代码并获取调用栈快照。采样结束后,分析报告中将包含函数调用次数之类的数据,可以利用这些数据确定可能成为应用程序瓶颈或关键路径的函数,然后创建一个插装式会话分析对这些区域进行分析。

插装是在目标码中插入探针或标记的过程,当正常的程序流经这些插装点时,应用程序在该点的相关数据会被记录下来。插装会很快生成大量数据,因此应该先用采样模式找出潜在的问题域或热点,再根据采样结果对需要进一步分析的特定代码域进行插装。

流逝时间(Elapsed time)是指某个函数从开始运行到结束所花费的时间。应用程序时间(Application time)是指代码实际执行时间扣除系统事件处理时间之后的估计值。如果应用程序在性能分析过程中被另一个应用程序打断,那么流逝时间还包括执行这个应用程序所花费的时间,而应用程序时间则不包含这部分时间。包含时间(Inclusive time)包括当前函数的执行时间及它所调用的函数的执行时间。独占时间不包括被调用函数的执行时间。

单击Hot path中一个方法可转到函数的详细信息页面:

由于此例过于简单,因此并未给出过多有用信息。

在顶端Current View下拉列表里选择Functions切换到Functions视图,在该视图中能够看到一些感兴趣的结果:

在上面的视图中列出了会话期间被采样或插装的所有函数。对于插装式分析,该视图显示的是目标中被插装且会话期间能够被调用的所有函数。对于采样式分析,该视图将包含应用程序访问的所有其他成员/程序集,此例只有采样式分析,因此只包含后者。

下图为插装式分析样图:

Visual Studio抽象出一些实用工具来完成性能分析工作。如果需要更多的控制或者需要将性能分析集成在自动化批处理过程中,那么就可以直接使用这些实用工具。一般流程如下:

  配置目标(必要时)和环境
  启动数据库记录引擎
  运行目标应用程序
  应用程序运行结束时,停止数据记录引擎
  生成会话报告

使用Visual Studio可以对Javascript进行性能分析,首先要设置一个插装式会话:

执行此性能分析会话时,性能分析器在收集应用程序的函数调用信息的同时也会收集JavaScript函数的性能信息。

常见的性能分析问题之调试符号

在查看性能分析报告时可以发现,一旦函数调用被解析到了对我们没有任何帮助的实体,如[ntdll.dll],当应用程序使用了无法找到调试符号的代码时,常常会发生这种情况,因此,我们得到的只是包含它的二进制文件而不是函数名。

调试符号是指带有.pdb扩展名的文件,其中包含了调试器和性能分析器用于发现执行代码信息的详细情况。Microsoft Symbol Server使我们可以通过Web连接动态地获取所需符号文件,选择Tools|Options指示Visual Studio使用该服务器,展开Debugging部分选择Symbols。

常见的性能分析问题之插装和代码覆盖

在运行插装式性能分析时,确保不要对以前其用过代码覆盖的目标进行性能分析。代码覆盖以另一种插装形式确定测试执行过程中所访问的代码,因此它们会有冲突。如果已经进行过代码覆盖,可以打开代码覆盖页面取消相关选项,重新生成解决方案就可以了。

时间: 2024-10-16 01:57:46

性能和性能分析的相关文章

MongoDB运行状态、性能监控,分析

转自http://tech.lezi.com/archives/290 MongoDB运行状态.性能监控,分析 Posted by neilxp on 十月 26, 2011Leave a comment (2)Go to comments 这篇文章的目的是让你知道怎么了解你正在运行的Mongdb是否健康. mongostat详解 mongostat是mongdb自带的状态检测工具,在命令行下使用.它会间隔固定时间获取mongodb的当前运行状态,并输出.如果你发现数据库突然变慢或者有其他问题的

Android 应用开发性能优化完全分析

1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质博文网上也还是有很多的,譬如Google官方都已经推出了优化专题,我这里只是总结下自的感悟而已,若有得罪欢迎拍砖,我

【转】Android应用开发性能优化完全分析

http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质博文网

转——Android应用开发性能优化完全分析

[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质博文网上也还是有很多的,

频繁分配释放内存导致的性能问题的分析

频繁分配释放内存导致的性能问题的分析 现象 1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 2 用ps -o majflt,minflt -C program命令查看,发现majflt每秒增量为0,而minflt每秒增量大于10000. 初步分析 majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误. 这两个数值表示一个进程自启动以来所发生的缺页中断的次数

Glusterfs目录ls性能优化方案分析

Glusterfs目录ls性能优化方案分析 目的和优化思路 讨论了glusterfs对文件系统爬虫rsync/ls目录性能的现有优化措施和可能的进一步优化方案.优化思路是减少本地文件系统的元数据操作,减少fuse client的负载,减少req的网络轮询次数,减少一次网络通信时间,缓存预抓取,并发,异步,bulk 传输 fuse readdirplus centos 6.4最新内核,支持fuse readdirplus.微调mount timeout参数. FUSE: Adaptive NFS-

转:Android应用开发性能优化完全分析

转自:http://blog.csdn.net/yanbober/article/details/48394201 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给出啥啥啥不能用,啥啥啥该咋用等,却很少有较为系统的进行真正性能案例分析的,大多数都是嘴上喊喊或者死记住规则而已(当然了,这话我自己听着都有些刺耳,实在不好意思,其实关于性能优化的优质

Android基础性能检测与分析

本文内容:基于Android基础性能检测与分析 版权声明:本文为原创文章,未经允许不得转载 博客地址:http://blog.csdn.net/kevindgk 前言 UI性能分析 应用启动时间计算以及程序启动白屏问题 内存分析 内存优化原则 内存区分 内存分析 内存泄露工具MAT 内存泄露工具LeakCanary 耗电量分析 性能检测和分析工具 1 高通性能分析器 - TrepnProfiler 2 高通调试器 - TuneUpKit 3 阿里-易测 云测平台 引用 联系方式 前言 最近一段时

嵌入式设备的网络性能该如何分析

最近对公司的嵌入式设备做了一个网络性能测试,如何确定网络性能的瓶颈在哪里,以及网络性能影响因素有哪些,有些心得记录在此. 一般评判网络性能都是看数据下载上传的速度.现在主流的带宽有2种,100Mbps和1000Mbps,2者理论上可以达到的下载最大速度分别为12.5MB/s和125MB/s. 设备的网络性能如何,影响因素很多,受所在局域网网络状况,对端设备性能影响很大,而且不同的应用程序测试速度也会有所不同. 那么该如何来分析设备的性能瓶颈? 对于嵌入式设备,测试网络性能一般是看从局域网内的PC

【MySql】性能优化之分析命令

[MySql]性能优化之分析命令     一 当发现程序运行比较慢的时候,首先排除物力资源问题之后,就将注意力转向mysq数据库: 1.首先确定运行慢的sql语句: mysql> show full processlist; 2.确认低效的查询: 多次执行第一步发现time耗费大的sql语句.查看耗费的时间. 3.为sql生成一个执行计划query Execution plan(QEP) mysql> explain select * from tbal_name where ...; 4.查