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_MONOTONIC
klok 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 elapsed
zorgvuldig heb gedaan om ervoor te zorgen dat de precisie niet verloren gaat bij het timen van zeer korte intervallen).
Als uw besturingssysteem CLOCK_MONOTONIC
niet biedt (wat u tijdens runtime kunt controleren met sysconf(_SC_MONOTONIC_CLOCK)
), dan kunt u CLOCK_REALTIME
als 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++