google-perftools+kcachegrind profiler your program

我之間用過一些開源的profiler工具,本身也作過一些工具,除了本身寫的工具能夠簡單獲取本身想要的那一部分數據以外,其餘的工具都不那麼容易,可是perftools倒是個例外,    它是一款針對 C/C++ 程序的性能分析工具,它是一個遵照 BSD 協議的開源項目。使用該工具能夠對 CPU 時間片、內存等系統資源的分配和使用進行分析,本文將重點介紹如何進行 CPU 時間片的剖
        這裏我將將介紹 如何進行 CPU 時間片的剖析,從安裝到數據的呈現,enjoy it。
    一,獲取google perftools 安裝包。
    您能夠在 google-perftools 的網站 (http://code.google.com/p/google-perftools/downloads/list) 上下載最新版的安裝包。我用的是gperftools-2.0.tar.gz

    二,install perftools
 1, 先配置安裝環境,   ./configure --prefix=/usr --enable-frame-pointers
    --prefix是指定安裝路徑,若是你不指定默認安裝在/usr/local/lib下面,並且可能會有在運行時找不到 
 libprofiler.so文件的可能。--enable-frame-pointer爲64位系統準備的。
  
  2,make , make install

  3,kcachegrind安裝,sudo apt-get install kcachegrind,這是爲了使用它查看生成的信息。

  三,獲得結果
  1,compiler
    在你的目標程序中嵌入libprofiler,具體怎麼加這要看你是使用makefile仍是cmake了。

  2,運行
    運行有兩種方式,第一種是靜態的在你的要測量的代碼的開始的位置和結束位置加上ProfilerStart("filename"),ProfilerStop(), 這樣在目標程序運行時就能夠對這段時間內程序實際佔用的 CPU 時間片進行統計和分析。隨便你本身選擇了。可是相對而言,工具中添加靈活性更好,開始/結束函數加到代碼中顯得比較死,我這裏使用的工具是gdb。
a,在代碼中加入函數
[C++]  view plain copy
  1. void function(){   
  2.   //TODO  
[C++]  view plain copy
  1. //...  
  2. ProfilerStart("CPUProfile");  
  3. //TODO  
[C++]  view plain copy
  1.  //...    
  2.    
  3.  ProfilerStop();  
  4. }   
固然你能夠將這兩個函數加到任意的地方,沒必要非得是同一個函數
b,   使用調試工具 gdb 在程序中手動運行性能工具的啓動 / 終止函數

命令 功能
ctrl+c 暫停程序的運行
c 繼續程序的運行
b 添加函數斷點(參數能夠是源代碼中的行號或者一個函數名)
p 打印某個量的值或者執行一個函數調用

for example: app

gdb YOUR_PROGRAM // 啓動 gdb 並選擇你的程序爲 gdb 的啓動目標 
(gdb)b main1.c:num // 對應於耗時模塊的起始點 
(gdb)b main1.c:num // 對應於耗時模塊的終止點 
(gdb)r // 運行 
(gdb)p ProfilerStart("MyProfile")
(gdb)c // 繼續程序運行 
(gdb)p ProfilerStop() async

這兩個函數能夠在任意兩個點之間開始和結束,只要你的程序能捕捉到更多的點,隨意添加都不會有太大的爲題。 函數

 四,分析結果 工具

1, pprof --text ./your_execute_file  ./MyProfile 性能


Using local file ./bin/nbd_google_pertools_n. 網站

Using local file asyn_profile_2. google

Removing _L_unlock_16 from all stack traces. spa

Total: 30 samples .net

       2   6.7%   6.7%        2   6.7% *__GI___libc_malloc 調試

       1   3.3%  10.0%        1   3.3% *__GI___libc_free

       1   3.3%  13.3%        1   3.3% _List_impl

       1   3.3%  16.7%        1   3.3% _Vector_impl

       1   3.3%  20.0%        1   3.3% __fdatasync_nocancel

       1   3.3%  23.3%        1   3.3% __gnu_cxx::new_allocator::construct

       1   3.3%  26.7%        1   3.3% __gnu_cxx::new_allocator::destroy

       1   3.3%  30.0%        1   3.3% __mutex_alloc (inline)

       1   3.3%  33.3%        1   3.3% __pthread_mutex_lock

       1   3.3%  36.7%        1   3.3% boost::detail::shared_count::swap

       1   3.3%  40.0%        1   3.3% boost::shared_ptr::operator->

       1   3.3%  43.3%        1   3.3% boost::unordered_detail::hash_table::find

       1   3.3%  46.7%        2   6.7% exec_implement::print_implement

       1   3.3%  50.0%        1   3.3% execution_base::begin_incoming_ins_call

       1   3.3%  53.3%        1   3.3% memcpy

......................................

具體每一項的意思你能夠去查下tutorial


2, pprof --callgrind ./your_execute_file ./MyProfile >you_prifiler.callgrind

kcachegrind you_profiler.callgrind


注意事項:

因爲perftools使用的是SIGPROF信號的handler來獲取stack信息的,你的程序不能屏蔽signal,不然會出現如下狀況:PROFILE: interrupts/evictions/bytes = 0/0/64,文件天然就不會有任何內容,由於我當初遇到過這樣的問題,望各位不要重蹈覆轍。

相關文章
相關標籤/搜索