通過perf event函式獲取ipc

2021-07-14 18:10:37 字數 2406 閱讀 7264

其實這個問題困擾了蠻久,主要還是不太會用..最後參考git上乙個**搞定了,還是很開心的。

直接上**吧:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define pid_num 176139

int core_id=-1;

static long

perf_event_open(struct perf_event_attr *hw_event, pid_t pid,

int cpu, int group_fd, unsigned long flags)

// setup info for perf_event

struct perf_event_attr attr[2];

intmain(int argc, char **argv)

for(pid=i=0;argv[1][i]!=0;i++)

pid=pid*10+argv[1][i]-'0';

}printf("%d\n",pid);

struct perf_event_attr pe;

long long count,cycles,instructions;

double ipc;

int fd[2];

core_id=core_id;

cycles=instructions=0;

memset(&pe, 0, sizeof(struct perf_event_attr));

attr[0].type = perf_type_hardware;

attr[0].config = perf_count_hw_cpu_cycles; /* generic pmu event*/

attr[0].disabled = 0;

fd[0] = perf_event_open(&attr[0], pid , core_id, -1, 0);

if (fd[0] < 0)

attr[1].type = perf_type_hardware;

attr[1].config = perf_count_hw_instructions; /* generic pmu event*/

attr[1].disabled = 0;

fd[1] = perf_event_open(&attr[1], pid , core_id, -1, 0);

if (fd[1] < 0)

//count cycles,instructions;

rc = read(fd[0], &val1[0], sizeof(val1[0])); assert(rc);

rc = read(fd[1], &val1[1], sizeof(val1[1])); assert(rc);

cycles= val1[0];

instructions = val1[1];

printf("round 1:cycles = %lld instructions= %lld\n",val1[0],val1[1]);

usleep(100000);//usleep takes microsecond

rc = read(fd[0], &val1[0], sizeof(val1[0])); assert(rc);

rc = read(fd[1], &val1[1], sizeof(val1[1])); assert(rc);

printf("round 2:cycles = %lld instructions= %lld\n",val1[0],val1[1]);

cycles= val1[0]-cycles;

instructions = val1[1]-instructions;

ipc=(double)instructions/(double)cycles;

printf("cycles = %lld instructions = %lld ipc=%f\n ",cycles ,instructions,ipc);

close(fd[0]);

close(fd[1]);

return 0 ;

}

gcc  test.c - o  ***

./*** pid

其中有個坑,我們都知道在命令列下sleep可以用小數表示,比如sleep(0.5)表示0.5秒。

但是這裡在c語言中,是整數的,用了小數雖然可以編譯通過,都取整為0,那就直接連續兩次讀取暫存器資訊,沒有延遲效果,結果自然就很不準確。

換成了usleep()函式即可解決,usleep單位為微妙。

perf_event_open()函式介紹可以參考

通過儲存函式獲取序列

實際應用程式開發過程中,大部分業務表是由程式進行增刪改,為避免衝突通常會配置序列表來配置序列生成規則。也部分表由運維人員進行配置,如系統控制引數等配置,程式不直接做增刪改 如果當前需求需要新增新的控制引數,由開發人員提供指令碼,運維執行 通常在插入資料時,主鍵的生成,通常採用的是max t.id 1...

通過函式棧空間獲取當前呼叫函式

關於stacktrace的基礎可以參見 stacktrace 頑強的灰太狼 我們在設計日誌模組時通常會記錄兩種資訊 1 軟體執行的業務資料 2 軟體執行的技術引數 如當前呼叫的函式堆疊 一下通過一下方法可以獲取當前呼叫的函式 獲取呼叫函式 1private static string getcall...

如何通過函式名獲取虛函式的位址?

測試環境 win8 vs2012 include include using namespace std class cbase virtual void f virtual void g virtual void h private int x typedef void fun typedef v...