[C] Nauwkeurig tijdverschil meten

Pagina: 1
Acties:

  • phaas
  • Registratie: Augustus 2001
  • Laatst online: 23-01-2025
Hallo,

Ik ben opzoek naar een manier om binnen een proces nauwkeurig een tijdverschil te meten. Denk hierbij aan het meten hoelang het duurt voordat een stuk code of een functie er over doet.
Het is mijn bedoeling dit in milliseconden te doen, preciezer hoeft niet.

Mijn eerste gedachte was gettimeofday( ) maar daarmee krijg ik op een één of andere manier rare resultaten.
C:
1
2
3
4
5
6
7
timeval tval, tval1;
gettimeofday( &tval, 0 );

// doe iets

gettimeofday( &tval1, 0 );
printf( "Verstreken tijd: %f", (float)(tval1.tv_usec - tval.tv_usec) / 1000.0 );

...levert dingen op behoorlijk die afwijken met het timen van het process met het Unix 'time' commando.
Volgens mij is alles gewoon in orde, naar mijn idee klopt de nauwkeurigheid gewoon niet.

Weet iemand of er een manier bestaat die platform onafhankelijk is? Een LIBC functie die de huidige tijd (correct) in milliseconden geeft zou in theorie genoeg zijn.

Dank!

[ Voor 3% gewijzigd door phaas op 21-06-2005 20:19 ]


  • phaas
  • Registratie: Augustus 2001
  • Laatst online: 23-01-2025
Hmm, ik geloof dat ik enigszins warm ben :)

Dit werkt op Unix/Linux
C:
1
2
3
4
struct timeval tval;
gettimeofday( &tval, 0 );

long msec =tval.tv_sec * 1000 + tval.tv_usec / 1000;


En op windows zou timeGetTime( ) dezelfde waarde als msec hierboven moeten retourneren.
Klopt het dat ik tval.tv_usec hierboven door 1000 moet delen? (usec -> msec)?

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 18:23

Robtimus

me Robtimus no like you

phaas schreef op dinsdag 21 juni 2005 @ 20:53:
C:
1
2
3
4
struct timeval tval;
gettimeofday( &tval, 0 );

long msec =tval.tv_sec * 1000 + tval.tv_usec / 1000;

Klopt het dat ik tval.tv_usec hierboven door 1000 moet delen? (usec -> msec)?
Klopt ja, maar 1 kleine aanpassing zou ik wel doorvoeren:
C:
1
2
3
4
5
6
7
8
9
10
struct timeval tval;
long msec = 0;
if (gettimeofday(&tval, NULL) == 0)
{
    msc = tval.tv_sec * 1000 + tval.tv_usec / 1000;
}
else /* -1 */
{
    /* ERROR! check errno */
}
Je mag er nml niet zomaar vanuitgaan dat het lukt.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
timeofday meet "wall clock", time meet CPU tijd door jouw programma gebruikt. Dat is fundamenteel niet hetzelfde. Logisch dat de resultaten verschillen.

Er is geen standaard C methode om <1 sec nauwkeurigheid te krijgen in ISO C. Daarvoor heb je POSIX nodig.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • phaas
  • Registratie: Augustus 2001
  • Laatst online: 23-01-2025
MSalters schreef op dinsdag 21 juni 2005 @ 21:43:
timeofday meet "wall clock", time meet CPU tijd door jouw programma gebruikt. Dat is fundamenteel niet hetzelfde. Logisch dat de resultaten verschillen.

Er is geen standaard C methode om <1 sec nauwkeurigheid te krijgen in ISO C. Daarvoor heb je POSIX nodig.
time meet sys, user en real. Ik neem aan dat 'real' de 'gewone' tijd is.
Enneh, gettimeofday( ) is toch een POSIX functie?