, 당신은 (반환 한 합계에서 사용)을 perf_event_open
시스템 호출을 사용할 수 있습니다
는 파일의 형식의 자세한 내용은 여기를 참조하십시오. 올바른 매개 변수를 얻으려면 약간 까다 롭습니다. 맨 페이지 http://web.eece.maine.edu/~vweaver/projects/perf_events/perf_event_open.html을보고 아래 코드를보십시오. 페이지 오류
static long perf_event_open(struct perf_event_attr *hw_event,
pid_t pid,
int cpu,
int group_fd,
unsigned long flags) {
int ret = syscall(__NR_perf_event_open, hw_event, pid, cpu,
group_fd, flags);
return ret;
}
를 다음 계산 :
struct perf_event_attr pe_attr_page_faults;
memset(&pe_attr_page_faults, 0, sizeof(pe_attr_page_faults));
pe_attr_page_faults.size = sizeof(pe_attr_page_faults);
pe_attr_page_faults.type = PERF_TYPE_SOFTWARE;
pe_attr_page_faults.config = PERF_COUNT_SW_PAGE_FAULTS;
pe_attr_page_faults.disabled = 1;
pe_attr_page_faults.exclude_kernel = 1;
int page_faults_fd = perf_event_open(&pe_attr_page_faults, 0, CPU, -1, 0);
if (page_faults_fd == -1) {
printf("perf_event_open failed for page faults: %s\n", strerror(errno));
return -1;
}
// Start counting
ioctl(page_faults_fd, PERF_EVENT_IOC_RESET, 0);
ioctl(page_faults_fd, PERF_EVENT_IOC_ENABLE, 0);
// Your code to be profiled here
.....
// Stop counting and read value
ioctl(page_faults_fd, PERF_EVENT_IOC_DISABLE, 0);
uint64_t page_faults_count;
read(page_faults_fd, &page_faults_count, sizeof(page_faults_count));
이것은 C 라이브러리가 아니지만 'time -v a.out'을 사용하여 페이지 폴트를 포함하여 프로그램에 관한 많은 정보를 표시 할 수 있습니다. – Daniel
링크의 첫 번째 줄에는 "C 프로그래밍 언어 서브 루틴 모음"이 나와 있습니다. 나는'time' 명령에 대해 알고 있지만,'C' 프로그램 내부에서 무엇인가 할 수 있다면 탐구했다. 그래도 고마워! – brokenfoot
"C 프로그램 내에서 사용할 수 있습니다." - 부정확 함을 용인 할 수 있습니까? 아마도 API가별로 없기 때문에이 시스템 콜을보고 들어가기를 원하는 시점에 잘못 선언 할 수 있습니다. –