2014-04-11 19 views
6

Possiedo una funzione di utilità che, a mio avviso, sta consumando gran parte del tempo di esecuzione della mia applicazione. Usando Time Profiler per guardare lo stack di chiamate, questa funzione occupa gran parte del tempo di esecuzione di qualsiasi funzione da cui viene chiamata. Tuttavia, dal momento che questa funzione di utilità è chiamata da molte fonti diverse, ho difficoltà a determinare se, nel complesso, questo è il miglior utilizzo del mio tempo di ottimizzazione.Come misurare il tempo totale trascorso in una funzione?

Come posso vedere il tempo totale trascorso in questa funzione durante l'esecuzione del programma, indipendentemente da chi l'ha chiamato?

Per chiarezza, voglio unire le voci selezionate con tutte le altre chiamate a quella funzione in una singola voce: Profiler Log

+0

Devi flessibilità e vuoi aggiungere del codice alla funzione colpevole e registrare i risultati nel debugger o vuoi una soluzione solo per gli strumenti? – SayeedHussain

+0

@paranoidcoder: Posso aggiungere codice, anche se mi piacerebbe una soluzione solo per strumenti. – user664939

risposta

2

Non sono a conoscenza di uno strumenti soluzione basata ma qui è qualcosa che si può fare dal codice . Spero che qualcuno fornisca una soluzione per gli strumenti, ma fino ad allora per farti andare qui va.

#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, grazie per l'aiuto. Continuerò ad accettare per ora, però, dato che spero ancora che ci sia un modo in Strumenti. – user664939

1

posso offrire la stoffa di risposta che stai cercando, ma non ho ottenuto questo lavoro all'interno Instruments ancora ...

Instruments utilizza dtrace sotto il cofano. dtrace consente di rispondere agli eventi nel programma come una funzione inserita o restituita da. La risposta a ogni evento può essere programmata.

È possibile create a custom instrument con lo scripting in Strumenti.

Ecco uno script di shell noddy che avvia dtrace all'esterno di Instruments e registra il tempo trascorso in una determinata funzione.

#!/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) 
} 
' 

Ciò che non ho ancora capito è come trasferire questo in strumenti e ottenere i risultati vengono visualizzati in un modo utile nella GUI.

2

Per visualizzare i totali per una particolare funzione, attenersi alla seguente procedura:

  1. profilo vostro programma con Time Profiler
  2. trovare e selezionare alcuna menzione della funzione di interesse nella visualizzazione chiamata albero (si può utilizzare Modifica-> Trova)
  3. Evoca il menu contestuale sulla funzione selezionata e 'focus su chiamate effettuate da' (O usare instrument> chiamata Albero dati MINING-> focus su chiamate effettuate dai)

Se il tuo programma è multi-thread e vuoi un totale tra tutti i thread, assicurati che 'Separa per Thread' non sia selezionato.

6

Per me, che cosa è il segno di spunta "Inverti albero delle chiamate". Sembra ordinare le funzioni "foglia" nell'albero delle chiamate in ordine di quelle che si accumulano più a lungo e ti permettono di vedere cosa le chiama.

La casella di controllo può essere trovato nel pannello di destra, chiamato "Impostazioni schermo" (Se nascosto: ⌘2 o Visualizza-> Inspectors-> Mostra impostazioni di visualizzazione)

0

Penso che si può chiamare il sistema ("ls tempo "); due volte e funzionerà solo per te. L'output verrà stampato sulla console di debug.

Problemi correlati