2014-04-11 7 views
6

Ich habe eine Dienstprogrammfunktion, von der ich vermute, dass sie einen großen Teil der Ausführungszeit meiner Anwendung verbraucht. Wenn Sie Time Profiler zum Anzeigen des Aufruf-Stacks verwenden, nimmt diese Funktion einen großen Teil der Ausführungszeit jeder Funktion ein, von der sie aufgerufen wird. Da diese Dienstprogrammfunktion jedoch aus vielen verschiedenen Quellen aufgerufen wird, kann ich nicht feststellen, ob dies die optimale Nutzung meiner Optimierungszeit ist.Wie wird die Gesamtzeit gemessen, die in einer Funktion verbracht wird?

Wie kann ich die Gesamtzeit betrachten, die in dieser Funktion während der Programmausführung verbracht wurde, unabhängig davon, wer sie angerufen hat?

Aus Gründen der Klarheit, möchte ich mit allen anderen Anrufe an diese Funktion in einem einzigen Eintrag, um die ausgewählten Einträge kombinieren: Profiler Log

+0

Haben Sie Flexibilität und Willen, der Täterfunktion etwas Code hinzuzufügen und die Ergebnisse im Debugger zu protokollieren, oder wollen Sie eine reine Instrumentenlösung? – SayeedHussain

+0

@paranoidcoder: Ich kann Code hinzufügen, obwohl ich eine reine Instrumentenlösung lieben würde. – user664939

Antwort

2

Ich bin mir nicht bewusst eines Instrumenten-basierte Lösung, aber hier ist etwas, das Sie von Code tun können . Hoffe jemand bietet eine Instrumentenlösung an aber bis dahin geht es hier los.

#include <time.h> 

//have this as a global variable to track time taken by the culprit function 
static double time_consumed = 0; 

void myTimeConsumingFunction(){ 
//add these lines in the function 
clock_t start, end; 

start = clock(); 
//main body of the function taking up time 
end = clock(); 

//add this at the bottom and keep accumulating time spent across all calls 
time_consumed += (double)(end - start)/CLOCKS_PER_SEC; 
} 

//at termination/end-of-program log time_consumed. 
+0

+1, danke für die Hilfe. Ich werde es jetzt aber abwarten zu akzeptieren, da ich immer noch hoffe, dass es einen Weg innerhalb von Instrumenten gibt. – user664939

1

kann ich das Zeug der Antwort bieten Sie suchen, aber nicht diese Arbeit innerhalb Instruments bekam noch ...

Instruments verwendet dtrace unter der Haube. dtrace ermöglicht es Ihnen, auf Ereignisse in Ihrem Programm zu reagieren, z. B. auf eine Funktion, die eingegeben oder von der zurückgegeben wird. Die Antwort auf jedes Ereignis kann als Skript festgelegt werden.

Sie können create a custom instrument mit Scripting in Instruments.

Hier ist ein Noddy-Shell-Skript, das dtrace außerhalb von Instruments startet und die Zeit in einer bestimmten Funktion aufzeichnet.

#!/bin/sh 

dtrace -c <yourprogram> -n ' 

unsigned long long totalTime; 
self uint64_t lastEntry; 

dtrace:::BEGIN 
{ 
    totalTime = 0; 
} 

pid$target:<yourprogram>:*<yourfunction>*:entry 
{ 
    self->lastEntry = vtimestamp; 
} 

pid$target:<yourprogram>:*<yourfunction>*:return 
{ 
    totalTime = totalTime + (vtimestamp - self->lastEntry); 
    /*@timeByThread[tid] = sum(vtimestamp - self->lastEntry);*/ 
} 

dtrace:::END 
{ 
    printf("\n\nTotal time %dms\n" , totalTime/1000000) 
} 
' 

Was habe ich noch nicht herausgefunden, wie dies in Instrumente übertragen und die Ergebnisse in einer sinnvollen Weise in der GUI angezeigt bekommen.

2

Um die Summen für eine bestimmte Funktion zu sehen, die folgenden Schritte aus:

  1. Profil Ihr Programm mit Zeit Profiler
  2. Suche und wählen Sie jede Erwähnung der Funktion von Interesse in der Aufrufstrukturansicht (können Sie verwenden Bearbeiten-> suchen)
  3. beschwören Sie das Kontextmenü über die ausgewählte Funktion und ‚Konzentrieren Sie sich auf Aufrufe von‘ (Oder verwenden Instrument-> Anruf Baum Daten Bergbau-> Fokus auf Aufrufe von)

Wenn Ihr Programm Multithread ist und Sie eine Gesamtsumme für alle Threads erhalten möchten, stellen Sie sicher, dass "Nach Thread trennen" nicht aktiviert ist.

6

Für mich, was der Trick tickt "Umkehren Call Tree". Es scheint, "Blatt" Funktionen im Anrufbaum in der Reihenfolge von denjenigen zu sortieren, die die meiste Zeit kumulieren und Ihnen erlauben zu sehen, was sie anruft.

Die Checkbox kann auf der rechten Seite zu finden, "Display Settings" genannt (Wenn versteckt: ⌘2 oder View-> Inspectors-> anzeigen Anzeigeeinstellungen)

0

ich glaube, Sie System aufrufen können ("time ls "); zweimal und es wird nur für dich arbeiten. Die Ausgabe wird auf der Debug-Konsole gedruckt.

Verwandte Themen