C: gebruik clock() om tijd te meten in programma’s met meerdere threads

Ik heb altijd clock() gebruikt om te meten hoeveel tijd mijn applicatie in beslag nam van begin tot eind, zoals;

int main(int argc, char *argv[]) {
  const clock_t START = clock();
  // ...
  const double T_ELAPSED = (double)(clock() - START) / CLOCKS_PER_SEC;
}

Sinds ik POSIX-threads gebruik, lijkt dit te mislukken. Het lijkt erop dat clock() N keer sneller toeneemt met N threads. Omdat ik niet weet hoeveel threads er tegelijkertijd zullen worden uitgevoerd, mislukt deze aanpak. Dus hoe kan ik meten hoeveel tijd er is verstreken?


Antwoord 1, autoriteit 100%

clock()meet de CPU-tijd die door uw proces wordt gebruikt, niet de wandkloktijd. Als je meerdere threads tegelijk hebt lopen, kun je de CPU-tijd natuurlijk veel sneller verbranden.

Als u de uitvoeringstijd van de wandklok wilt weten, moet u een geschikte functie gebruiken. De enige in ANSI C is time(), die doorgaans slechts een resolutie van 1 seconde heeft.

Zoals je echter al zei dat je POSIX gebruikt, betekent dit dat je clock_gettime()kunt gebruiken, gedefinieerd in time.h. Vooral de CLOCK_MONOTONICklok is hiervoor het beste te gebruiken:

struct timespec start, finish;
double elapsed;
clock_gettime(CLOCK_MONOTONIC, &start);
/* ... */
clock_gettime(CLOCK_MONOTONIC, &finish);
elapsed = (finish.tv_sec - start.tv_sec);
elapsed += (finish.tv_nsec - start.tv_nsec) / 1000000000.0;

(Merk op dat ik de berekening van elapsedzorgvuldig heb gedaan om ervoor te zorgen dat de precisie niet verloren gaat bij het timen van zeer korte intervallen).

Als uw besturingssysteem CLOCK_MONOTONICniet biedt (wat u tijdens runtime kunt controleren met sysconf(_SC_MONOTONIC_CLOCK)), dan kunt u CLOCK_REALTIMEals een fallback – maar houd er rekening mee dat dit laatste het nadeel heeft dat het onjuiste resultaten zal genereren als de systeemtijd wordt gewijzigd terwijl uw proces loopt.


Antwoord 2

Welke timingresolutie heb je nodig? Je zou time() van time.h kunnen gebruiken voor de tweede resolutie. Als u een hogere resolutie nodig heeft, kunt u iets meer systeemspecifiek gebruiken. Zie Timerfunctie om tijd in nanoseconden te geven met C++

Other episodes