Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème dans l'utilisation de gettimeofday

4 réponses
Avatar
stephane_www
Bonjour,

J'ai un petit probl=E8me de compr=E9hension avec la fonction
gettimeofday.
Ayant voulu l'utiliser pour mesurer le temps d'un traitement j'ai =E9t=E9
surpris des r=E9sultats qui par momment sont =E9tonnants, en tout cas
pour le champ tv_usec de la structure timeval.
D=E9j=E0 la valeur de tv_usec et toujour inf=E9rieur =E0 tv_sec. Comme les
deux champs correspondent au temps =E9coul=E9 depuis le 01/01/1970, le
premier en micro-seconde et le second en secondes ca ne me semble pas
logique. Mais peut =EAtre y a t il une expliquation ?

Dans le test suivant le resutat semble coh=E9rent (code =E0 la fin) :
gcc -std=3Dc99 tod.c && ./a.out 100
[=2E..]
Temps :
(1121244597 - 1121244597) =3D 0s
(21481 - 21290) =3D 191=B5s

Par contre, par momment quand le temps est relativement long, les
r=E9sultats semblent vraiment bidons, j'obtiens des valeurs n=E9gatives
pour le champ tv_usec (ce n'est pas syst=E9matique) :
gcc -std=3Dc99 tod.c && ./a.out 100000
[=2E..]
Temps :
(1121244183 - 1121244179) =3D 4s
(223652 - 380030) =3D -156378=B5s

Voyez vous une explication ?

Info :
gcc -v : gcc version 3.3.2 (Mandrake Linux 10.0 3.3.2-6mdk)
uname -a : Linux teli 2.6.3-7mdksmp #1 SMP Wed Mar 17 14:24:28 CET 2004
i686 unknown unknown GNU/Linux

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

int main( int argc, char** argv )
{
if ( argc !=3D 2 )
return 1;
int maxLoops =3D atoi( *(argv+1) );
struct timeval timeod0 =3D { 0, 0 }, timeod1 =3D { 0, 0 };
if ( gettimeofday( &timeod0, NULL ) !=3D 0 )
{
perror( "gettimeofday 0" );
return 1;
}

for ( int i =3D 0; i < maxLoops; ++i )
printf( "valeur de i =3D %d", i );

printf( "\n\n" );
if ( gettimeofday( &timeod1, NULL ) !=3D 0 )
{
perror( "gettimeofday 1" );
return 1;
}

printf( "Temps :\n\t(%ld - %ld) =3D %lds\n\t(%ld - %ld) =3D %ld=B5s\n"
,timeod1.tv_sec, timeod0.tv_sec, timeod1.tv_sec -
timeod0.tv_sec
,timeod1.tv_usec, timeod0.tv_usec, timeod1.tv_usec -
timeod0.tv_usec );

return 0;
}

4 réponses

Avatar
fabrizio
Bonjour,

je ne crois pas me tromper en imaginant que vous mésinterpréter
les timeval
{t.tv_sec = 1
t.tv_usec = 500}
veut dire 1.0005 seconde

Fabrice
Avatar
fabrizio
je ne crois pas me tromper en imaginant que vous mésinterpréter
les timeval
{t.tv_sec = 1
t.tv_usec = 500}
veut dire 1.0005 seconde


J'ajoute même qu'on trouve ce genre de choses pour obtenir des
différences :

/* Subtract the `struct timeval' values X and Y,
storing the result in RESULT.
Return 1 if the difference is negative, otherwise 0. */

int
timeval_subtract (result, x, y)
struct timeval *result, *x, *y;
{
/* Perform the carry for the later subtraction by updating y. */
if (x->tv_usec < y->tv_usec) {
int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
y->tv_usec -= 1000000 * nsec;
y->tv_sec += nsec;
}
if (x->tv_usec - y->tv_usec > 1000000) {
int nsec = (x->tv_usec - y->tv_usec) / 1000000;
y->tv_usec += 1000000 * nsec;
y->tv_sec -= nsec;
}

/* Compute the time remaining to wait.
tv_usec is certainly positive. */
result->tv_sec = x->tv_sec - y->tv_sec;
result->tv_usec = x->tv_usec - y->tv_usec;

/* Return 1 if result is negative. */
return x->tv_sec < y->tv_sec;
}

Peut-être est-ce même directement inclus dans la libc. Peut-être.

Fabrice

Avatar
stephane_www
fabrizio wrote:
Bonjour,

je ne crois pas me tromper en imaginant que vous mésinterpréter
les timeval
{t.tv_sec = 1
t.tv_usec = 500}
veut dire 1.0005 seconde

Exacte, mon man n'est pas clair;

Merci beaucoup.

Avatar
stephane_www
fabrizio wrote:
je ne crois pas me tromper en imaginant que vous mésinterpréter
les timeval
{t.tv_sec = 1
t.tv_usec = 500}
veut dire 1.0005 seconde



J'ajoute même qu'on trouve ce genre de choses pour obtenir des
différences :
[....]

C'est effectivement mon but :)


Peut-être est-ce même directement inclus dans la libc. Peut-être.

Je n'ai rien trouvé, mais ton code me suffit.


Merci.
--
Stephane.