是否可以使用perf来收集程序执行的部分硬件计数器统计信息?如果是这样,怎么样?
likwid提供了能够定义命名区域的功能,但如果在只安装了perf的系统上可以实现这一点,那就太棒了。
之前的一些问题已经回复了相关答案,但仍有一些缺点:
答案 0 :(得分:2)
产生一个子进程来运行性能统计。
将perf stat
附加到父项。
在需要时从父进程中终止子进程。
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
int main()
{
int pid= getpid();
int cpid = fork();
if( cpid == 0)
{
// child process . Run your perf stat
char buf[50];
sprintf(buf, "perf stat -p %d > stat.log 2>&1",pid);
execl("/bin/sh", "sh", "-c", buf, NULL);
}
else
{
// set the child the leader of its process group
setpgid(cpid, 0);
//////////////////////////////////////////////
// part of program you wanted to perf stat
sleep(3);
////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
// stop perf stat by killing child process and all its descendants(sh, perf stat etc )
kill(-cpid, SIGINT);
////////////////////////////////////////////////////////////////////
// rest of the program
sleep(2);
}
}
答案 1 :(得分:1)