VS2010中的Profile(性能剖析)功能十分实用,它可以协助程序员迅速锁定当前程序的性能瓶颈,为程序的优化做准备。
点击VS2010的Analyze菜单,选择Launch Performance Wizard,依照提示可以很方便地完成Profile的必需配置。可能你会碰到"Injection of runtime library failed"错误,这时就不要使用Wizard,而要选择Analyze下拉菜单中的Profiler->Attach/Detach...,将Profiler附加到进程上。
本文以名为Sorting的小程序为例。程序中除了main函数之外,定义了全局函数SortData和PrintData分别实现排序和打印功能。核心代码如下所示:
- //! SortAndPrint definition
- /*!
- param iNum 待排序数组大小
- param data 待排序数组首指针
- eturn 函数执行成功则返回1
- - 三种方式排序
- -# 冒泡排序
- -# 数组+STL sort
- */
- bool SortData(int &iNum,int* data)
- {
- int temp;
- //! 冒泡排序
- for(int i=1;i<iNum;++i)
- {
- for(int j=0;j<iNum-i;++j)
- {
- if(data[j]>data[j+1])
- {
- temp=data[j];
- data[j]=data[j+1];
- data[j+1]=temp;
- }
- }
- }
- return 1;
- }
- //! PrintData definition
- /*!
- 打印有序数列到屏幕
- param iNum 待排序数组大小
- param data 待排序数组首指针
- eturn 函数执行成功则返回1
- */
- bool PrintData(int &iNum,int* data)
- {
- //! 输出有序数列
- for(int i=0;i<iNum;++i)
- {
- if(i%50==0)
- {
- //system("pause");
- }
- _tprintf_s(_T("%d "),data[i]);
- }
- return 1;
- }
测试用例为50000个随机整数,采用冒泡排序,程序对应的Sample Profiling Report如图1所示。
图1 采用冒泡排序,程序对应的哦Sample Profiling Report
修改SortData的代码为:
- bool SortData(int&iNum,int* data)
- {
- sort(data,data+iNum-1);
- return 1;
- }
这里调用了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才能确定程序是否真的得到了优化。