2012-10-23 10 views
5

Ich profiliere meinen Code und habe den teuersten Teil davon gefunden. Es geschieht jedoch in einer Inline-Funktion. Um den Einfluss zu messen, musste ich die Funktion nicht inline machen.Callgrind Inlined Funktionen

Jetzt möchte ich genaue Profiling-Daten melden. Ohne Inline haben wir einen massiven Overhead (die Funktion ist im Grunde eine einzelne Schleife, aber sie wird sehr, sehr oft genannt).

Ich frage mich, ob es möglich ist, valgrind anweisen, einen bestimmten Abschnitt des Codes als eine Funktion für sich zu behandeln (wie die Makros CALLGRIND_START_INSTRUMENTATION, CALLGRIND_STOP_INSTRUMENTATION), ohne die Funktion nicht inline zu zwingen.

Antwort

5
valgrind --tool=callgrind 

ist in der Lage viele Details darüber, wo die CPU (und andere Kosten wie als Cache) zu zeigen, ausgegeben wird. kcachegrind (Visualisierungswerkzeug) kann die verschiedenen Kosten (einschließlich für inlined Funktionen) leicht zeigen.

Versuchen Sie, z. mit:

valgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes 

Hinweis: aussehen Kosten auf Befehlsebene, müssen Sie kcachegrind

+0

Tatsächlich funktioniert es großartig. kcachegrind ist ein sehr nettes Werkzeug! – ypnos

-1

Ich bin nicht sicher, ob dies ist, was Sie wollen, aber ich bin nicht sicher, es ist nicht :):
http://valgrind.org/docs/manual/cg-manual.html#cg-manual.overview

Da auch ein Befehls-Cache-Lese pro Befehl ausgeführt durchgeführt wird, können Sie feststellen, aus wie viele Anweisungen pro Zeile ausgeführt werden, die für traditionelles Profiling nützlich sein können.

+0

Ja, verwenden Sie lesen ich diese Zeile, aber ich konnte nicht finden, wie man etwas über funktions Umfang Granularität zu tun. – ypnos

0

Vielleicht könnten Sie das CALLGRIND_TOGGLE_COLLECT Makro aufrufen kurz vor Ihrer Funktion und zu Beginn Ihrer Funktion, dito für den Ausgang Ihrer Funktion und nur nach dem Aufruf Ihrer Funktion aufrufen. Zum Beispiel

int main() 
{ 
    CALLGRIND_TOGGLE_COLLECT; 
    myFunction(); 
    CALLGRIND_TOGGLE_COLLECT; 
} 

__attribute__((noinline)) 
void myFunction() 
{ 
    CALLGRIND_TOGGLE_COLLECT; 
    //Do stuff 
    CALLGRIND_TOGGLE_COLLECT; 
} 

Sollte den Trick tun.