Wird callgrind profiling von anderen Prozessen beeinflusst?

8

Ich möchte meine Anwendung mithilfe von Callgrind profilieren. Jetzt, da es eine sehr lange Zeit dauert, in der Zwischenzeit gehe ich mit Web-Browsing, Kompilierung und anderen intensiven Aufgaben auf dem gleichen Rechner fort.

Beeinträchtige ich die Profilergebnisse? Da Valgrind eine simulierte CPU verwendet, sollten andere externe Prozesse nicht stören mit Valgrind Ausführung. Habe ich Recht?

    
Paolo M 11.09.2015, 10:48
quelle

1 Antwort

7

Callgrind zeichnet standardmäßig nichts mit der Zeit auf, so dass Sie davon ausgehen können, dass alle gesammelten Metriken (größtenteils) unabhängig von anderen Prozessen auf dem Rechner sind. Wie im Callgrind-Handbuch angegeben ist,

  

Standardmäßig bestehen die gesammelten Daten aus der Anzahl der ausgeführten Anweisungen, ihrer Beziehung zu Quellzeilen, der Anrufer / Angerufenen-Beziehung zwischen Funktionen und der Anzahl solcher Aufrufe.

Daher sollten die Messwerte der Callgrind-Berichte nur davon abhängen, welche Anweisungen das Programm auf der (simulierten) CPU ausführt - nicht wie lange diese Anweisungen dauern. In der Tat kann die Ausgabe von Callgrind in der Tat etwas irreführend sein, da die simulierte CPU möglicherweise anders als die reale CPU arbeitet (insbesondere wenn es um die Verzweigungsvorhersage geht). Das Callgrind-Papier, das auf der ICCS 2004 vorgestellt wurde , ist darüber ebenfalls sehr klar:

  

Wir stellen fest, dass die Simulation nicht in der Lage ist, die verbrauchte Wanduhrzeit vorherzusagen, da dies eine detaillierte Simulation der Mikroarchitektur erfordern würde.

In jedem Fall wird die simulierte CPU jedoch von der tatsächlichen CPU nicht beeinflusst. Der Grund ist einfach. Wie du gesagt hast, dein Programm wird überhaupt nicht auf deinem Rechner ausgeführt. Stattdessen übersetzt Valgrind zur Laufzeit dynamisch Ihr Programm, dh es disassembliert die Binärdatei in "UCode" für eine simulierte Maschine, fügt Analysecode (Instrumentierung genannt) hinzu und erzeugt dann Binärcode, der die Simulation ausführt. Die Hinzufügung von Analysecode macht das Zählen von Befehlen (in Callgrind), die Speicherprüfung (in Memcheck) und alle anderen Plugins möglich.

Darin liegt jedoch die Wendung. Natürlich gibt es Grenzen dafür, wie isoliert das Programm in einer solchen dynamischen Simulation laufen kann. Erstens könnte Ihr Programm mit anderen Programmen interagieren. Während die dafür aufgewendete Zeit irrelevant ist (da sie nicht berücksichtigt wird), können sich die Rückgabecodes der prozessübergreifenden Kommunikation sicherlich ändern, je nachdem, was sonst im System passiert. Zweitens müssen die meisten Systemaufrufe nicht übersetzt werden und ihre Rückkehrcodes können sich ebenfalls ändern - was zu unterschiedlichen Ausführungspfaden Ihres Programms führt und somit leicht unterschiedliche Metriken sammelt. (Nebenbei bietet Calgrind eine Option zum Aufzeichnen der Wanduhrzeit während Syscalls, die immer von dem beeinflusst wird, was sonst noch im System passiert). Weitere Details zu diesen Einschränkungen finden Sie in der Dissertation von Nicholas Nethercote ("Dynamic Binary Analysis and Instrumentation") .

    
Christoph Sommer 15.09.2015, 14:07
quelle

Tags und Links