Timing-programma's in C

Ik moet mijn C-programma in het programma zelf timen (omdat ik meerdere subsecties van de code timmer en hun tijd uitvoer). Dit moet worden gedaan met (ten minste) milliseconde nauwkeurigheid. Ik heb begrepen dat "time.h" alleen functioneert naar de tweede. Is er een andere manier om dit te doen?

2
Welk platform gebruikt u?
toegevoegd de auteur Jacob, de bron
Maak een wrapper voor de tijdfunctie. Gebruik # if s en/of # ifdef om platformspecifieke tijdfuncties te leveren. Lever geen standaardimplementatie. Op die manier compileert uw code niet eens op platforms die u niet kent.
toegevoegd de auteur Thomas Eding, de bron
Linux, maar zou het niet mogelijk moeten zijn om dit op een platformonafhankelijke manier te doen, omdat de timing binnen het programma zelf wordt uitgevoerd.
toegevoegd de auteur Jonathon Vandezande, de bron

2 antwoord

U kunt de functie gettimeofday uitproberen, de tijd heeft een nauwkeurigheid van microseconden.

2
toegevoegd
Dit werkt alleen op platforms die gettimeofday implementeren. Het is geen standaard libc. Hoewel timeval voldoende ruimte heeft om microseconden terug te zetten, is de werkelijke resolutie platformafhankelijk.
toegevoegd de auteur smparkes, de bron

You can use the function clock() from :

De clock() functie retourneert een benadering van de processortijd die door het programma wordt gebruikt.

U deelt de retourwaarde door de macro CLOCKS_PER_SEC om een ​​tijdshoeveelheid in seconden te krijgen, en als u de tijd in milliseconden wilt hebben, kunt u de waarde met 1000 vermenigvuldigen, dat wil zeggen:

double get_time_as_ms(void) {
   return ((double)(clock() * 1000)/CLOCKS_PER_SEC);
}

Of beter gezegd: begin en einde clock_t en bereken vervolgens het verschil:

double duration_as_ms(clock_t start, clock_t end) {
    return ((double)(end - start) * 1000)/CLOCKS_PER_SEC;

}

clock_t start = clock(); /* start of program */
/* ... */
clock_t end = clock(); /* end of program */
/* ... */
printf("Duration: %fms\m", duration_as_ms(start, end));

EDIT: Just thought I'd add, a common value for CLOCKS_PER_SEC is 1000000, meaning that the value returned by clock() would be a one-hundred-thousandth of a second. Therefore it's accurate to one one-thousandth of a millisecond (a microsecond).

2
toegevoegd
Wil de OP echt CPU-tijd, geen tijd op de muur? Merk ook op dat alleen al omdat CLOCKS_PER_SECs hoog is, niet wil zeggen dat er zoveel significante cijfers zijn.
toegevoegd de auteur smparkes, de bron
@havexz: de waarde die wordt geretourneerd door clock() moet nauwkeuriger zijn dan milliseconden. Op mijn computer is CLOCKS_PER_SEC gedefinieerd als 1000000 , daarom is deze nauwkeurig tot een honderdduizendste seconde. Dat betekent dat het nauwkeurig is tot een duizendste van een milliseconde.
toegevoegd de auteur AusCBloke, de bron
@havexz: Ja, ik heb het misschien niet zo goed geformuleerd. Ik heb de formulering bewerkt nadat ik deze heb gepost om te proberen deze weer te geven wat ik eigenlijk in de code heb bedoeld, maar het is waarschijnlijk nog steeds niet geweldig. Als je de verkeerde manier vermenigvuldigt, verliest kan de precisie.
toegevoegd de auteur AusCBloke, de bron
Maar je verliest de precisie, is dat niet de eerste vereiste in de vraag ....
toegevoegd de auteur havexz, de bron
snap het ... eigenlijk wat je zegt in antwoord en het codefragment zegt verschillende dingen. In antwoord zei je dat eerst delen en later vermenigvuldigen en het fragment tegenovergesteld is ... het is mijn slechte ... is nu duidelijk
toegevoegd de auteur havexz, de bron
Ik kreeg wat meer info, dus ik dacht dat ik het wilde delen, de klok vertelt je alleen over CPU-tijd niet real-time http://pubs.opengroup.org/onlinepubs/007908799/xsh/strftime.‌ html als je op zoek bent naar alleen cpu-tijd is het goed
toegevoegd de auteur havexz, de bron