其實這個問題困擾了蠻久,主要還是不太會用..最後參考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...