【性能分析】初探VS2010中的Profile(性能剖析)功能 - TOMMYHU - 专注互联网开发及运营技术,提供相关资料及软件下载,奇趣网络时事评论!
Jun 30

【性能分析】初探VS2010中的Profile(性能剖析)功能 不指定

tommyhu , 09:46 , ASP.NET , Comments(0) , Trackbacks(0) , Reads(5409) , Via Original Large | Medium | Small

VS2010中的Profile(性能剖析)功能十分实用,它可以协助程序员迅速锁定当前程序的性能瓶颈,为程序的优化做准备。

点击VS2010的Analyze菜单,选择Launch Performance Wizard,依照提示可以很方便地完成Profile的必需配置。可能你会碰到"Injection of runtime library failed"错误,这时就不要使用Wizard,而要选择Analyze下拉菜单中的Profiler->Attach/Detach...,将Profiler附加到进程上。

本文以名为Sorting的小程序为例。程序中除了main函数之外,定义了全局函数SortData和PrintData分别实现排序和打印功能。核心代码如下所示:

        
  1. //! SortAndPrint definition  
  2.     
  3. /*!
  4.     
  5.     \param iNum 待排序数组大小
  6.     
  7.     \param data 待排序数组首指针
  8.     
  9.     \return 函数执行成功则返回1
  10.     
  11.     
  12.     
  13.     - 三种方式排序
  14.     
  15.         -# 冒泡排序
  16.     
  17.         -# 数组+STL sort
  18.     
  19. */  
  20.     
  21. bool SortData(int &iNum,int* data)  
  22.     
  23. {  
  24.     
  25.     int temp;  
  26.     
  27.     //! 冒泡排序  
  28.     
  29.     for(int i=1;i<iNum;++i)  
  30.     
  31.     {  
  32.     
  33.         for(int j=0;j<iNum-i;++j)  
  34.     
  35.         {  
  36.     
  37.             if(data[j]>data[j+1])  
  38.     
  39.             {  
  40.     
  41.                 temp=data[j];  
  42.     
  43.                 data[j]=data[j+1];  
  44.     
  45.                 data[j+1]=temp;  
  46.     
  47.             }  
  48.     
  49.         }  
  50.     
  51.     }  
  52.     
  53.     return 1;  
  54.     
  55. }  
  56.     
  57.   
  58.     
  59. //! PrintData definition  
  60.     
  61. /*!
  62.     
  63.     打印有序数列到屏幕
  64.     
  65.     \param iNum 待排序数组大小
  66.     
  67.     \param data 待排序数组首指针
  68.     
  69.     \return 函数执行成功则返回1
  70.     
  71. */  
  72.     
  73. bool PrintData(int &iNum,int* data)  
  74.     
  75. {  
  76.     
  77.       
  78.     
  79.     //! 输出有序数列  
  80.     
  81.     for(int i=0;i<iNum;++i)  
  82.     
  83.     {  
  84.     
  85.         if(i%50==0)  
  86.     
  87.         {  
  88.     
  89.             //system("pause");  
  90.     
  91.         }  
  92.     
  93.         _tprintf_s(_T("%d\n"),data[i]);  
  94.     
  95.     }  
  96.     
  97.     return 1;  
  98.     
  99. }  

测试用例为50000个随机整数,采用冒泡排序,程序对应的Sample Profiling Report如图1所示。

图1 采用冒泡排序,程序对应的哦Sample Profiling Report

修改SortData的代码为:

        
  1. bool SortData(int&iNum,int* data)  
  2.     
  3. {  
  4.     
  5.     sort(data,data+iNum-1);  
  6.     
  7.     return 1;  
  8.     
  9. }  

这里调用了STL中的sort函数模板,程序对应的Sample Profiling Report如图2所示。

图2 调用STL sort函数模板,程序对应的Sample Profiling Report

观察图1和图2中的CPU Usage曲线,一定程度上图2更优一些;观察Hot Path(即调用热路径),已经从图1中的SortData转移到图2中的Unknown Function;另外,函数独占工作时间也发生了变化,图2显示耗费最大的已经不再是SortData函数了。

VS2010同样提供了对比工具,将图1和图2各自的Sample Profiling Report进行Compare,如图3所示。

非常明显,核心的函数调用,调用了STL sort模板函数的新程序对资源的消耗要小很多。

上面的例子说明,借助于VS2010 Profiler,可以迅速锁定当前程序的性能瓶颈,如本例中的SortData函数,为程序的优化做准备;程序优化之后,Profiler也是一个必要的验证工具,只有比较优化前后程序Profiling Report才能确定程序是否真的得到了优化。


▲返回顶部
Last modified by tommyhu on2013/06/30 09:49

Add a comment

Nickname

emotemotemotemotemotemotemotemotemotemotemotemotemotemotemotemot