Hello World
Spiga

使用Profiler分析程序性能

2009-12-22 11:37 by 老赵, 13035 visits

三个星期之前我向大家求助说,VS的Profiler分析程序性能时无法跟踪框架内部的方法调用。当时我做了不少尝试,例如下载并配置了.NET Framework的symbol文件和源代码,还尝试使用了ANTS Profiler和CLR Profiler等其他工具,最终还是没有成功。Ivony...老大在评论中告诉我说Sampling方式可以获得比Instrumentation更多的信息,不过我觉得Sampling得到的结果并不像我的目标那样干净,因此还是在寻找Instrumentation的方式。不过最终耗费了一个GTSC的支持点数,才被告知——的确应该使用Sampling。

那么我现在就来详细描述一下Profiler的使用方式吧。

首先,我们准备一个Console项目ProfilerSample,其中放入一段测试代码:

点此显示

然后在菜单里选择Analyze - Profiler - New Performance Session,并将ProfilerSample加入Targets中:

请注意这里的Profile方式是Sampling。于是我们Profile这个程序(ProfilerSample),将会得到一个报表,于是我们可以浏览它的Call Tree:

这里显示的,已经是Expand All后的结果,可以看到调用非常之多。至于Column,除了Function Name之外,我只保留了“Inclusive Samples”和“Inclusive Samples %”两列,它们表示有多少次采样是落在这个方法的“调用树”上的。当然,您还可以选择Exlusive Samples等列,它与Inclusive的区别在于,Exlusive Samples不包括落在当前方法“子过程”里的采样。

此外,如果您看到的结果并不像截图里那么多,可能是由于Noise Reduction Options的设置关系。您可以点击上图工具栏中最右侧的按钮进行设置。

但是,看着这么一大堆信息我们会无从下手。因此,我们将滚动条拖到中段,可以发现ProfilerSample.Program.Main方法。对它点击右键,选择Set Root便会将其设为树装图的根。再折叠一些意义不大的方法(如mscorwks.dll),我们可以得到这样的结果:

经过观察,可以知道哪个方法,包括框架里的方法消耗的时间比较长。至于Sampling的细节,例如采样的频率,您可以在Performance Session的属性中进行设置。例如,可以选择不同的时钟周期长短进行采样。一般来说,采样频率越高,结果越准确,但这也意味着采样本身可能就会占用较多的时间——还好我们观察的主要是“比例”而不是绝对数量。

不过话说回来,我认为这个做法的目的还是在于观察框架“内部实现”的性能,有点探究“黑盒”的意味。在实际使用过程中,我们可能还是使用Instrumentations为好,因为这样得到的结果比较“干净”:

虽然信息较Sampling为少,但是对于我们进行性能优化来说已经足够了。因为此时结果里显示的都是我们自己写的方法,这也是我们唯一可以修改的东西。

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

37 条回复

  1. 老赵
    admin
    链接

    老赵 2009-12-22 11:38:00

    写着写着就没情绪了……要截图的文章就是写不下去……

  2. 不若相忘于江湖
    *.*.*.*
    链接

    不若相忘于江湖 2009-12-22 11:55:00



    老赵啥时写一篇完整的程序性能测试例子.

    最好与数据库性能测试相结合.

  3. 老赵
    admin
    链接

    老赵 2009-12-22 11:58:00

    @不若相忘于江湖
    结合数据库性能?Profiler不负责数据库的。

  4. 张蒙蒙
    *.*.*.*
    链接

    张蒙蒙 2009-12-22 12:13:00

    可是有图的看着比较容易引起兴趣,

  5. Justin
    *.*.*.*
    链接

    Justin 2009-12-22 12:40:00

    赞一下,这是个宝贵经验

  6. EricZhang(T2噬菌体)
    *.*.*.*
    链接

    EricZhang(T2噬菌体) 2009-12-22 14:51:00

    Jeffrey Zhao:写着写着就没情绪了……要截图的文章就是写不下去……


    哈哈,强烈建议先截图、画图,搞定这些,再写文章。。。一边截图一边写文章很令人崩溃的说。。。

  7. 老赵
    admin
    链接

    老赵 2009-12-22 15:23:00

    @EricZhang(T2噬菌体)
    主要还是工具不好用。
    你平时截图用什么工具吗?
    我刚找了一个PicPick似乎还不错。

  8. EricZhang(T2噬菌体)
    *.*.*.*
    链接

    EricZhang(T2噬菌体) 2009-12-22 15:31:00

    @Jeffrey Zhao
    我直接用QQ。。。我设截图快捷键为Ctrl+Alt+P,很好用。。。^_^

  9. winter-cn
    *.*.*.*
    链接

    winter-cn 2009-12-22 15:39:00

    老赵可以考虑替GTSC答个题 把点数赚回来

  10. 老赵
    admin
    链接

    老赵 2009-12-22 15:41:00

    @winter-cn
    等用完再说咯

  11. Ivony...
    *.*.*.*
    链接

    Ivony... 2009-12-22 15:52:00

    嗯,QQ的截图功能很强大,很多时候够用了。

    不过Live Writer要有个截图的插件就更好了。

  12. 老赵
    admin
    链接

    老赵 2009-12-22 15:56:00

    @Ivony...
    QQ截图等单独拿出来用不?

  13. 菜鸟毛
    *.*.*.*
    链接

    菜鸟毛 2009-12-22 16:58:00

    忙了一阵,很久没来,又学到不少.

    另外问下,请问截那种带花边的图片用的啥软件,貌似很流行的说.

  14. lexus
    *.*.*.*
    链接

    lexus 2009-12-22 17:06:00

    有一个叫dotTrace的工具不知道是不是老赵想要的

  15. 老赵
    admin
    链接

    老赵 2009-12-22 17:15:00

    @lexus
    应该没什么区别的

  16. Ivony...
    *.*.*.*
    链接

    Ivony... 2009-12-22 17:43:00

    Jeffrey Zhao:
    @Ivony...
    QQ截图等单独拿出来用不?



    没试过,但我一直都开着QQ,所以没有这个问题。。。


    菜鸟毛:
    忙了一阵,很久没来,又学到不少.

    另外问下,请问截那种带花边的图片用的啥软件,貌似很流行的说.




    你说的是SnagIt?

  17. xuefly
    *.*.*.*
    链接

    xuefly 2009-12-22 17:52:00

    Windows7上有截图工具还好,Office OneNote上的截图工具也不错的说

  18. peterzb
    *.*.*.*
    链接

    peterzb 2009-12-22 18:10:00

    Ivony...:

    Jeffrey Zhao:
    @Ivony...
    QQ截图等单独拿出来用不?



    没试过,但我一直都开着QQ,所以没有这个问题。。。


    菜鸟毛:
    忙了一阵,很久没来,又学到不少.

    另外问下,请问截那种带花边的图片用的啥软件,貌似很流行的说.




    你说的是SnagIt?


    应该是SPX_5.0吧, 截图HyperSnap也不错; 使用qq截图好处是直接可以在上面描箭头,填写文字方便

  19. 垃圾呆
    *.*.*.*
    链接

    垃圾呆 2009-12-22 19:15:00

    @xuefly
    SnagIt 截图很好用~

  20. 老赵
    admin
    链接

    老赵 2009-12-22 20:35:00

    @垃圾呆
    可惜要钱

  21. 垃圾呆
    *.*.*.*
    链接

    垃圾呆 2009-12-22 20:46:00

    在用Profiler的时候,开始正常,后面强制关次进程之后为啥一直报Could not launch ... .Injection of runtime library failed.有没碰到过,google了下 也还是~

  22. 深山老林
    *.*.*.*
    链接

    深山老林 2009-12-22 21:46:00

    辛苦了呵呵。

  23. oec2003
    *.*.*.*
    链接

    oec2003 2009-12-22 22:54:00

    一直都用FastStone Capture 还不错

  24. cwsjd[未注册用户]
    *.*.*.*
    链接

    cwsjd[未注册用户] 2009-12-22 23:02:00

    大哥,请教一下!

    我的VS2008菜单中怎么找不到你说的这个Analyze - Profiler - New Performance Session?

    能不能解释下这个Analyze 菜单是从哪儿调用出来的?

    谢了。。。

  25. 老赵
    admin
    链接

    老赵 2009-12-22 23:28:00

    @cwsjd
    没有的话说明版本不对吧。

  26. 我还是不懂
    *.*.*.*
    链接

    我还是不懂 2009-12-23 09:22:00

    QQ截图可以单独取出来的。给你下载地址
    http://files.cnblogs.com/zs851/QQjietu.rar
    包括截图后编辑的功能也有

  27. hahha[未注册用户]
    *.*.*.*
    链接

    hahha[未注册用户] 2009-12-23 13:30:00

    ANTS Profiler那个柱形图显示的 用起来感觉不错啊。。。
    epsnap截图应该还可以的~~~

  28. 颜斌
    *.*.*.*
    链接

    颜斌 2009-12-23 15:28:00

    我还是不懂:
    QQ截图可以单独取出来的。给你下载地址
    http://files.cnblogs.com/zs851/QQjietu.rar
    包括截图后编辑的功能也有


    下载后查毒,有病毒,麦咖啡报的,供大家参考。

  29. 我还是不懂
    *.*.*.*
    链接

    我还是不懂 2009-12-23 15:59:00

    不会吧。我的没问题啊。。没有报病毒,用的诺顿

  30. Will Meng
    *.*.*.*
    链接

    Will Meng 2009-12-23 18:07:00

    晕死,我们公司的vs2008是专业版的,没有Profiler
    为什么不用Visual Studio Team System 2008 Development Edition?
    难道比专业版要贵很多吗?

  31. JacksonLin
    *.*.*.*
    链接

    JacksonLin 2009-12-28 17:35:00

    旧东西,还没有把重心拿出来

  32. 老赵
    admin
    链接

    老赵 2009-12-28 17:38:00

    @JacksonLin
    你是指什么呀?有没有更多资料?

  33. stg609
    115.193.164.*
    链接

    stg609 2010-07-24 17:14:45

    老赵,今天我也用了这个profiler,但是有个弱弱的问题, inclusive Samples,这个是什么意思?还有inclusive Samples %,eclusive samples,你上面提到是程度执行的时间?我如果单从字面解释,怎么也无法和时间联系在一起,请老赵赐教。

  34. daydayfree
    64.233.172.*
    链接

    daydayfree 2010-11-24 23:51:22

    现在越来越觉得 profiler 很重要,是得好好学学。

  35. xiaomin
    116.227.181.*
    链接

    xiaomin 2011-03-01 22:34:42

    inclusive samples是非独占样本数,指某个函数从开始到结束得样本数 exclusive samples是指独占样本数,指某个函数A调用了函数B,C,那么独占样本数是A-B-C

  36. 链接

    min 2011-03-01 23:10:10

    Sample-采样分析方法定期中断计算机处理器并收集函数调用堆栈。 调用堆栈是一个动态结构,用于存储有关正在处理器上执行的函数的信息。 Instrumentation-分析工具的检测分析方法在分析的二进制文件中目标函数的开始和结尾以及这些函数对其他函数的每次调用前后插入代码,记录分析信息。参考:http://msdn.microsoft.com/zh-cn/library/bb385770.aspx

    CLR本身其实就带有很多的Profiler API(C语言)。参考链接:

    另外dotTrace工具可以查看系统调用。

  37. Flynn
    116.6.64.*
    链接

    Flynn 2011-04-25 16:39:02

    然后在菜单里选择Analyze,是在VS 菜单里选吗?我的VS 2010 pro版里没有这项呀?

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我