Domanda

sto misurando il tempo fisico tra due eventi in questo modo:

#include <time.h>
#include <sys/time.h>

timeval wall_time0;
timeval wall_time1;

// start of period measurement
gettimeofday( &wall_time0 , 0);

...stuff happening 

// end of period measurement
gettimeofday( &wall_time1 , 0);

return ( ( wall_time1.tv_sec - wall_time0.tv_sec ) + (( wall_time1.tv_usec - wall_time0.tv_usec )/(double)1000000) );

Ma ora, ho bisogno di un modo per misurare il tempo logico che il thread è in realtà utilizzando. Cioè, in teoria che dovrebbe essere il tempo fisico, meno il tempo trascorso in esecuzione altri thread e / o la logica del sistema e del kernel.

I pensava questo è stato il modo per farlo:

clock_t mTime0;
clock_t mTime1;

//start of period measurement
mTime0=clock();

... stuff happening


//end of period measurement
mTime1=clock();
return (mTime1-mTime0)/(double)CLOCKS_PER_SEC;

, ma facendo un paio di misurazioni, ho notato due problemi:

1) per alcune misure è più grande di tempo fisico, che non è giusto (cioè: per alcuni loop, il tempo fisico sarebbe 0,2495 .. e "logica" (misurato con orologio () ) sarebbe 0,27, per le misure più piccole che sarebbe proprio dietro fino a zero, che porta al secondo problema ...)

2) il tempo risultante sembra essere una grossolana molto di quello di ritorno da gettimeofday

c'è un modo migliore per misurare il tempo discussione locale in linux?

È stato utile?

Soluzione 3

Ok, dopo un po 'di ricerche ho scoperto che getrusage riempie entrambe le esigenze menzionati:

pagina man getrusage

quindi sostanzialmente il codice richiesto è molto simile a come misurare i tempo fisico con gettimeofday, solo che ora uso getrusage

#include <time.h>
#include <sys/time.h>
#include <sys/resource.h>

timeval processed_time0;
timeval processed_time1;
rusage paramStruct
// start of period measurement
int result = getrusage( &paramStruct);
processed_time0 = paramStruct.ru_utime;

...stuff happening 

// end of period measurement
int result = getrusage( &paramStruct );
processed_time1 = paramStruct.ru_utime;

return ( ( processed_time1.tv_sec - processed_time0.tv_sec ) + (( processed_time1.tv_usec - processed_time0.tv_usec )/(double)1000000) );

in questo modo mi dà sia

1) processo corrente consumata tempo

2) Risoluzione microsecondi

Ho studiato Boost Date.Time, ma nella documentazione non c'è niente di processo o utente in funzione del tempo di sistema di nota, penso che la libreria è appena occupa di misurare il tempo fisico

Altri suggerimenti

Ci sono alcune opzioni di maggiore precisione si potrebbe usare - sguardo sys/timex.h. Anche Boost Date.Time per esempio ha millisecondo e superiori timer di precisione.

Per quanto riguarda il 'tempo totale> tempo trascorso fisico', io ho visto che in tempi multi-threaded. Questo è semplicemente un 'contabilità' thingie:. Tutto cpu 'consumo' si aggiunge e potrebbe anche essere più di tempo trascorso nel codice multithreading se tutte le discussioni funzionano, alcune spese generali di programmazione viene aggiunto e presto si dispone di più tempo trascorso

Il campo di tv_usec struct timeval è in microsecondi, non in unità di 1/(double)CLOCKS_PER_SEC.

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