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 待排序數組首指針
- \return 函數執行成功則返回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 待排序數組首指針
- \return 函數執行成功則返回1
- */
- bool PrintData(int &iNum,int* data)
- {
- //! 輸出有序數列
- for(int i=0;i<iNum;++i)
- {
- if(i%50==0)
- {
- //system("pause");
- }
- _tprintf_s(_T("%d\n"),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才能確定程序是否真的得到了優化。