J'essaie d'imprimer une valeur de type timeval. En fait, je peux l’imprimer, mais je reçois l’avertissement suivant:
Plusieurs marqueurs à cette ligne
Le programme compile et affiche les valeurs, mais j'aimerais savoir si je fais quelque chose de mal. Merci.
printf("%ld.%6ld\n",usage.ru_stime);
printf("%ld.%6ld\n",usage.ru_utime);
où l'usage est de type
typedef struct{
struct timeval ru_utime; /* user time used */
struct timeval ru_stime; /* system time used */
long ru_maxrss; /* maximum resident set size */
long ru_ixrss; /* integral shared memory size */
long ru_idrss; /* integral unshared data size */
long ru_isrss; /* integral unshared stack size */
long ru_minflt; /* page reclaims */
long ru_majflt; /* page faults */
long ru_nswap; /* swaps */
long ru_inblock; /* block input operations */
long ru_oublock; /* block output operations */
long ru_msgsnd; /* messages sent */
long ru_msgrcv; /* messages received */
long ru_nsignals; /* signals received */
long ru_nvcsw; /* voluntary context switches */
long ru_nivcsw; /* involuntary context switches */
}rusage;
struct rusage usage;
Dans la bibliothèque GNU C , struct timeval
:
est déclaré dans sys/time.h et a les membres suivants:
long int tv_sec
Ceci représente le nombre de secondes entières du temps écoulé.
long int tv_usec
C'est le reste du temps écoulé (une fraction de seconde), représenté par le nombre de microsecondes. C'est toujours moins d'un million.
Donc vous devrez faire
printf("%ld.%06ld\n", usage.ru_stime.tv_sec, usage.ru_stime.tv_usec);
pour obtenir un horodatage "joliment formaté" comme 1.000123
.
Depuis struct timeval
sera déclaré quelque chose comme:
struct timeval {
time_t tv_sec;
suseconds_t tv_usec;
}
vous devez accéder aux champs sous-jacents:
printf ("%ld.%06ld\n", usage.ru_stime.tv_sec, usage.ru_stime.tv_usec);
printf ("%ld.%06ld\n", usage.ru_utime.tv_sec, usage.ru_utime.tv_usec);
oui sa
int main( void )
{
clock_t start, stop;
long int x;
double duration;
static struct timeval prev;
struct timeval now;
start = clock(); // get number of ticks before loop
for( x = 0; x < 1000000000; x++ );
// sleep(100);
stop = clock(); // get number of ticks after loop
// calculate time taken for loop
duration = ( double ) ( stop - start ) / CLOCKS_PER_SEC;
printf( "\nThe number of seconds for loop to run was %.2lf\n", duration );
gettimeofday(&now, NULL);
prev.tv_sec = duration;
if (prev.tv_sec)
{
int diff = (now.tv_sec-prev.tv_sec)*1000+(now.tv_usec-prev.tv_usec)/1000;
printf("DIFF %d\n",diff);
}
return 0;
}
Oui, timeval est défini comme ceci
struct timeval {
time_t tv_sec;
suseconds_t tv_usec;
}
En utilisant
printf ("%ld.%06ld\n", usage.ru_stime.tv_sec, usage.ru_stime.tv_usec);
va sûrement aider.
Je viens de composer cette petite fonction pratique à partir des informations ci-dessus. Autonome, sauf pour avoir besoin de temps. Appelez-le avec l'étiquette que vous voulez partout où vous voulez connaître l'heure dans votre flux stdout.
void timestamp(char *lbl) { // just outputs time and label
struct timeval tval;
int rslt;
rslt = gettimeofday(&tval,NULL);
if (rslt) printf("gettimeofday error\n");
printf("%s timestamp: %ld.%06ld\n", lbl, tval.tv_sec, tval.tv_usec);
}
La sortie typique ressemble à: Dpyfunc a obtenu l’horodatage ftqmut: 1537394319.501560
Et, vous pouvez entourer les appels avec un # ifdef pour les activer et les désactiver en même temps en commentant votre #define. Cela pourrait être utile presque comme le profilage, mais vous pouvez le désactiver rapidement pour le code de production/édition. Comme:
#define TIMEDUMPS
#ifdef TIMEDUMPS
timestamp("function 1 start");
#endif
#ifdef TIMEDUMPS
timestamp("function 2 start");
#endif
Mettez en commentaire le #define TIMEDUMPS et il les éteint tous. Peu importe combien, dans combien de fichiers de code source.