Desidero calcolare il tempo in millisecondi richiesto dall'esecuzione di parte del mio programma. Ho cercato online, ma non ci sono molte informazioni su questo argomento. Qualcuno di voi sa come farlo?Calcolo del tempo trascorso in un programma C in millisecondi
risposta
Le librerie C hanno una funzione che consente di ottenere l'ora del sistema. È possibile calcolare il tempo trascorso dopo aver catturato i tempi di inizio e fine.
La funzione è chiamata gettimeofday() e puoi guardare la pagina man per scoprire cosa includere e come usarlo.
Su Windows, si può solo fare questo:
DWORD dwTickCount = GetTickCount();
// Perform some things.
printf("Code took: %dms\n", GetTickCount() - dwTickCount);
Non è la soluzione più generale/elegante, ma bello e veloce quando ne avete bisogno.
La funzione gettimeofday
restituisce il tempo con precisione microsecondo (se la piattaforma può supportare che, ovviamente):
Il gettimeofday() funzione è ottenere l'ora corrente, espressa come secondi e microsecondi dal l'epoca e memorizzarla nella struttura temporale puntata da tp. La risoluzione dell'orologio di sistema è non specificato.
'gettimeofday' isn È ideale per misurare il tempo trascorso tra due eventi, perché l'orologio del sistema può essere modificato tra gli eventi (ad esempio mediante un aggiornamento NTP o semplicemente un'azione dell'amministratore). (A volte però * è * la cosa migliore disponibile, però). – caf
Un'altra opzione (almeno su alcuni UNIX) è clock_gettime e relative funzioni. Questi permettono l'accesso a vari orologi in tempo reale e puoi selezionare uno di quelli a risoluzione più alta e gettare via la risoluzione che non ti serve.
In particolare, l'orologio 'CLOCK_MONOTONIC', se il sistema su cui si sta lavorando lo supporta (' sysconf (_SC_MONOTONIC_CLOCK)> 0'). – caf
modo migliore per rispondere è con un esempio:
#include <sys/time.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
/* Return 1 if the difference is negative, otherwise 0. */
int timeval_subtract(struct timeval *result, struct timeval *t2, struct timeval *t1)
{
long int diff = (t2->tv_usec + 1000000 * t2->tv_sec) - (t1->tv_usec + 1000000 * t1->tv_sec);
result->tv_sec = diff/1000000;
result->tv_usec = diff % 1000000;
return (diff<0);
}
void timeval_print(struct timeval *tv)
{
char buffer[30];
time_t curtime;
printf("%ld.%06ld", tv->tv_sec, tv->tv_usec);
curtime = tv->tv_sec;
strftime(buffer, 30, "%m-%d-%Y %T", localtime(&curtime));
printf(" = %s.%06ld\n", buffer, tv->tv_usec);
}
int main()
{
struct timeval tvBegin, tvEnd, tvDiff;
// begin
gettimeofday(&tvBegin, NULL);
timeval_print(&tvBegin);
// lengthy operation
int i,j;
for(i=0;i<999999L;++i) {
j=sqrt(i);
}
//end
gettimeofday(&tvEnd, NULL);
timeval_print(&tvEnd);
// diff
timeval_subtract(&tvDiff, &tvEnd, &tvBegin);
printf("%ld.%06ld\n", tvDiff.tv_sec, tvDiff.tv_usec);
return 0;
}
rimarcato più in linea con la convenzione. – dmckee
hm ... non ho risposto a questa domanda una settimana fa: http://stackoverflow.com/questions/1444428/time-stamp-in-the-c-programming-language/1445808#1445808 – Christoph