2012-11-09 10 views
5

Gibt es eine einfache Möglichkeit, schnell die Anzahl der ausgeführten Anweisungen (x86 Befehle - welche und wieviele) zu zählen, während ein C-Programm ausgeführt wird?Schnelle Möglichkeit, die Anzahl der in einem C-Programm ausgeführten Befehle zu zählen

Ich benutze gcc version 4.7.1 (GCC) auf einer x86_64 GNU/Linux Maschine.

+2

Ich stimme mit Doness 'Antwort überein, dass normalerweise Leute die Ausführungszeit pro Funktion profilieren möchten. Wenn Sie jedoch genaue Zählungen für jeden ausgeführten Befehl erhalten möchten, müssen Sie Ihren Code in einem Simulator für Anweisungsgruppen ausführen, z. B. http://www.simplescalar.com/ – TJD

+0

Können Sie näher erläutern, was Sie versuchen? erreichen? Auf x86 hängt die Leistung der Befehlsausführung weit mehr vom Kontext als von der tatsächlichen Anweisung ab - praktisch können alle Anweisungen beispielsweise geladen oder gespeichert werden. Und reine Register-zu-Register-Befehle hängen auf komplexen Wegen vom Pipelinestatus moderner CPUs ab. Das klingt für mich nicht nach nützlichen Informationen. –

+1

Warum fragst du? Normalerweise bedeutet * Profiling * etwas anderes ... zB kompiliere mit 'gcc -pg -Wall -O' und benutze' gprof' oder vielleicht 'oprofile' !! –

Antwort

3

Wahrscheinlich ein Duplikat this question

sagen, dass ich wahrscheinlich, weil Sie für die Assembler-Anweisungen gefragt, aber diese Frage behandelt die C-Level-Profilierung von Code.

Meine Frage an Sie wäre jedoch: Warum möchten Sie die tatsächlichen ausgeführten Maschinenanweisungen profilieren? Als aller erstes Problem würde dies zwischen verschiedenen Compilern und deren Optimierungseinstellungen abweichen. Als praktischeres Thema, was könnten Sie eigentlich mit diesen Informationen tun? Wenn Sie nach Engpässen suchen/optimieren, suchen Sie nach dem Code Profiler.

Ich könnte hier etwas wichtiges verpassen.

+0

Anzahl der CPU-Anweisungen * ausgeführt * wäre ein einfacher Weg, um Algorithmen zu vergleichen, ohne sich um Schluckauf oder um Ressourcen mit anderen Programmen zu kümmern, unabhängig von der Verarbeitungsleistung, obwohl sie immer noch vom Befehlssatz abhängig sind. – mpen

+1

@ mpen: nicht unbedingt, z.B.Wenn Sie einen Algorithmus haben, der große Nachschlagetabellen verwendet, und einen anderen, der dieselbe Sache unter Verwendung eines rechnerischeren Ansatzes tut, dann kann der erste viel mehr Ladeanweisungen haben, von denen jeder aufgrund von Cachespeicherfehlschlägen möglicherweise für mehr als 100 Zyklen blockieren könnte. In ähnlicher Weise könnte man einen Algorithmus haben, der viele teure Anweisungen verwendet, z. 'FSQRT', und ein anderer Algorithmus, der solche teuren Befehle vermeidet und vielleicht ein paar weitere adds/multiplies verwendet - der zweite mag zwar schneller sein, obwohl er mehr Befehle ausführt. –

1

Sie können die Anzahl der ausgeführten Anweisungen mit dem Hardware Performance Counter (HPC) einfach zählen. Um auf das HPC zugreifen zu können, benötigen Sie eine Schnittstelle dazu. Ich empfehle Ihnen, PAPI Performance API zu verwenden.