2014-10-11 28 views
5

wpadłem perf analizy na poniższym pustym programuperf stat daje inną liczbę instrukcji dla każdego biegu

#include <stdio.h> 
int main() { 
} 

Po kompilacji i uruchamiania perf stat ./a.out Mam następujący wynik mówiący (wraz z inne dane, takie jak liczba cykli zegara, zadanie itp):

418,869 instructions # 0.87 insns per cycle 

liczbę instrukcji zmian podczas każdego „” perf analizy tego samego elfa.

Naprawdę potrzebuję znaleźć liczbę instrukcji w konkretnej funkcji, którą napisałem. Tak więc odejmuję powyższą liczbę od liczby instrukcji w nowym programie (mógłbym policzyć liczbę linii w programach s utworzonych przy użyciu znacznika -S w gcc, ale jestem zdezorientowany po spojrzeniu na zachowanie perf)

Dlaczego liczba instrukcji nie jest zgodna, a dokładniej nie to samo?

Aktualizacja ja za przykładem podanym w man page używać perf_event_open() w C

Odpowiedz

4

Aby zmierzyć liczbę instrukcji wykonywanych przez funkcję, proponuję, aby rozpocząć i zatrzymać wydarzenia liczenia perf_event_open() przy wjeździe funkcyjnego i wychodzisz zamiast uruchamiać dwa razy swój program zi bez funkcji.

Jeśli chodzi o brak determinizmu liczby instrukcji wykonywanych przez pusty program, być może liczysz zdarzenia zarówno na ziemi użytkownika, jak i jądra. Myślę, że liczba użytkowników powinna pozostać taka sama pomiędzy dwoma przebiegami, ale w przypadku części jądra wiele rzeczy dzieje się za sceną, aby wykonać ten program, więc domyślam się, że nie determinizm pochodzi z tego, co dzieje się w kodzie jądra. Aby policzyć tylko instrukcje dotyczące przestrzeni użytkownika, możesz użyć:

perf stat -e instructions:u a.out 

Czy możesz podać więcej szczegółów na temat różnic?

+0

perf_event_open() dał mi dokładną liczbę równą liczbie instrukcji w pliku .s. Instrukcje perf stat -e: u a.out podaje również za każdym razem inny numer, ale wariacja nie jest tak duża, jak w scenariuszu wyjaśnionym w pytaniu. – Vignesh

+0

przy użyciu perf_event_open dokładnie nkwo to, co mierzysz. Dla (małej) zmiany pozostającej nawet po dodaniu: u Sądzę, że wiele rzeczy wciąż jest robionych w przestrzeni użytkownika, zanim wywoływana jest główna funkcja w twoim programie, i może jest tu jakaś odmiana. –