Come posso trovare il tempo di esecuzione di una sezione del mio programma in C?

StackOverflow https://stackoverflow.com/questions/173409

  •  05-07-2019
  •  | 
  •  

Domanda

Sto cercando di trovare un modo per ottenere il tempo di esecuzione di una sezione di codice in C. Ho già provato sia time () che clock () da time.h, ma sembra che time () ritorni secondi e clock () sembra darmi millisecondi (o centisecondi?) Vorrei però qualcosa di più preciso. C'è un modo in cui posso prendere il tempo con almeno una precisione di microsecondi?

Questo deve solo essere in grado di compilare su Linux.

È stato utile?

Soluzione

Hai fatto riferimento a clock () e time () - stavi cercando gettimeofday () ? Ciò riempirà un struct timeval , che contiene secondi e microsecondi.

Ovviamente la risoluzione effettiva dipende dall'hardware.

Altri suggerimenti

Per quello che vale, eccone uno che contiene solo alcune macro:

#include <time.h>
clock_t startm, stopm;
#define START if ( (startm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define STOP if ( (stopm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define PRINTTIME printf( "%6.3f seconds used by the processor.", ((double)stopm-startm)/CLOCKS_PER_SEC);

Quindi usalo con:

main() {
  START;
  // Do stuff you want to time
  STOP;
  PRINTTIME;
}

Da http://ctips.pbwiki.com/Timer

Desideri un'applicazione profiler .

Parole chiave di ricerca su SO e motori di ricerca: profilazione linux

Prova " bench.h " ; ti consente di inserire un START_TIMER; e STOP_TIMER (" nome "); nel tuo codice, permettendoti di confrontare arbitrariamente qualsiasi sezione di codice (nota: consigliata solo per sezioni brevi, non per cose che richiedono decine di millisecondi o più). È accurato per il ciclo di clock, sebbene in alcuni rari casi possa cambiare il modo in cui viene compilato il codice in mezzo, nel qual caso stai meglio con un profiler (anche se i profiler in genere sono più sforzi da utilizzare per specifiche sezioni di codice).

Funziona solo su x86.

Potresti voler cercare su Google uno strumento di strumentazione .

Non troverai una chiamata in libreria che ti permetta di superare la risoluzione di clock della tua piattaforma. O usa un profiler (man gprof) come suggerito da un altro poster, oppure - quick & amp; dirty - metti un ciclo intorno alla sezione offensiva del codice per eseguirlo molte volte e usa clock ().

gettimeofday () ti offre una risoluzione di microsecondi, mentre < code> clock_gettime () ti offre una risoluzione di nanosecondi.

int clock_gettime(clockid_t clk_id, struct timespec *tp);

Il clk_id identifica l'orologio da utilizzare. Utilizzare CLOCK_REALTIME se si desidera che un orologio di sistema sia visibile a tutti i processi. Usa CLOCK_PROCESS_CPUTIME_ID per il timer per processo e CLOCK_THREAD_CPUTIME_ID per un timer specifico del thread.

Dipende dalle condizioni .. I profiler sono simpatici per le visioni globali generali, tuttavia se hai davvero bisogno di una visione accurata la mia raccomandazione è KISS. È sufficiente eseguire il codice in un ciclo in modo tale che il completamento richieda circa un minuto. Quindi calcola una media semplice in base al tempo di esecuzione totale e alle iterazioni eseguite.

Questo approccio ti consente di:

  1. Ottieni risultati accurati con timer a bassa risoluzione.

  2. Non si verificano problemi in cui la strumentazione interferisce con le cache ad alta velocità (l2, l1, branch..etc) vicino al processore. Tuttavia, l'esecuzione dello stesso codice in un ciclo ristretto può anche fornire risultati ottimistici che potrebbero non riflettere le condizioni del mondo reale.

Non so su quale ambiente / sistema operativo stai lavorando, ma i tuoi tempi potrebbero essere imprecisi se un altro thread, attività o processo anticipa il tuo codice temporizzato nel mezzo. Suggerisco di esplorare meccanismi come mutex o semafori per impedire ad altri thread di impedire il tuo processo.

Se stai sviluppando su x86 o x64, perché non utilizzare il Time Stamp Counter: RDTSC .

Sarà più affidabile di Ansi C come time () o clock () poiché RDTSC è una funzione atomica. L'utilizzo delle funzioni C a questo scopo può comportare problemi in quanto non si ha la garanzia che il thread che stanno eseguendo non verrà disattivato e di conseguenza il valore restituito non sarà una descrizione accurata del tempo di esecuzione effettivo che si sta tentando di misurare .

Con RDTSC puoi misurarlo meglio. Dovrai convertire nuovamente il conteggio dei tick in un tempo leggibile dall'uomo formato H: M: S che dipenderà dalla frequenza di clock dei processori ma google around e sono sicuro che troverai esempi.

Tuttavia, anche con RDTSC includerai il momento in cui il tuo codice è stato disattivato, mentre una soluzione migliore rispetto all'utilizzo di time () / clock () se hai bisogno di una misurazione esatta dovrai passare a un profiler che strumentare il codice e prendere in considerazione quando il codice non viene effettivamente eseguito a causa di cambi di contesto o altro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top