gperftools

gperftools是google出品的一個性能分析工具,相關介紹可見:https://github.com/gperftools/gperftools/wikigit

安裝

gperftools在64位系統上須要unwind庫的支持,因此須要先安裝libunwind,並且對版本有了要求github

下載:https://github.com/libunwind/libunwind/releases   函數

解壓後 ./configure CFLAGS=-U_FORTRIFY_SOURCE CFLAGS=-fPIC --prefix=/home/yourpath  ; sudo make ; sudo make install ;工具

下載:https://github.com/gperftools/gperftools/releases  同上 性能

安裝過程當中可能有各類 error,make[3]: *** [install-libLTLIBRARIES] Error 1 可忽略。測試

圖形工具graphvizgoogle

使用

一、能夠直接調用提供的API(在須要測試的代碼的先後分別調用ProfilerStart()和ProfilerStop()) spa

一直運行的程序因爲不能正常退出,因此不能採用上面的方法。咱們能夠用信號量來開啓/關閉性能分析code

#include <gperftools/profiler.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>

void gprofStartAndStop(int signum) {
    static int isStarted = 0;
    if (signum != SIGUSR1) return;

    //經過isStarted標記將來控制第一次收到信號量開啓性能分析,第二次收到關閉性能分析。
    if (!isStarted){
        isStarted = 1;
        ProfilerStart("test.prof");
        printf("ProfilerStart success\n");
    }else{
        ProfilerStop();
        printf("ProfilerStop success\n");
    }
}

void f()
{
    int i;
    for (i=0; i<1024*1024; ++i)
    {
        char *p = (char*)malloc(1024*1024);
        free(p);
    }
}

int main()
{
    signal(SIGUSR1, gprofStartAndStop);

    while(1){
        printf("call f\n");
        f();
        sleep(1);//爲了防止死循環,致使信號處理函數得不到調度
    }
    return 0;
}

用top命令查看進程的PID
kill -s SIGUSR1 PID //第一次運行命令啓動性能分析
kill -s SIGUSR1 PID //再次運行命令關閉性能分析,產生test.profblog

對於一個函數的CPU使用時間分析,分爲兩個部分:

1.整個函數消耗的CPU時間,包括函數內部其餘函數調用所消耗的CPU時間

2.不包含內部其餘函數調用所消耗的CPU時間(內聯函數除外)

生成文本風格結果:

pprof --text ./demo my.prof > profile.txt

關於文本風格輸出結果,每行包含6列數據,依次爲: 

列號 說明
1 分析樣本數量(不包含其餘函數調用),樣本數量至關於消耗的CPU時間
2 分析樣本百分比(不包含其餘函數調用)
3 目前爲止的分析樣本百分比(不包含其餘函數調用)
4 分析樣本數量(包含其餘函數調用)
5 分析樣本百分比(包含其餘函數調用)
6 函數名

整個函數消耗的CPU時間至關於包括函數內部其餘函數調用所消耗的CPU時間

生成圖形風格結果:

pprof --pdf ./demo my.prof > profile.pdf

1.節點

每一個節點表明一個函數,節點數據格式:

Class Name
Method Name
local (percentage)
of cumulative (percentage)

local時間是函數直接執行的指令所消耗的CPU時間(包括內聯函數);性能分析經過抽樣方法完成,默認是1秒100個樣本,一個樣本是10毫秒,即時間單位是10毫秒;

cumulative時間是local時間與其餘函數調用的總和;若是cumulative時間與local時間相同,則不打印cumulative時間項。
有向邊:調用者指向被調用者,有向邊上的時間表示被調用者所消耗的CPU時間

 

二、能夠以靜態連接方式進行連接並在執行的時候經過環境變量指定分析文件的輸出路徑:

http://blog.51cto.com/wulingdong/2043898

相關文章
相關標籤/搜索