Tři alternativy
clock()
gettimeofday()
clock_gettime()
clock_gettime()
dosahuje až nanosekundové přesnosti a podporuje 4 hodiny.
-
CLOCK_REALTIME
Celosystémové hodiny reálného času. Nastavení těchto hodin vyžaduje příslušná oprávnění.
-
CLOCK_MONOTONIC
Hodiny, které nelze nastavit a představují monotónní čas od nějakého nespecifikovaného počátečního bodu.
-
CLOCK_PROCESS_CPUTIME_ID
Časovač jednotlivých procesů s vysokým rozlišením z CPU.
-
CLOCK_THREAD_CPUTIME_ID
Hodiny procesorového času specifické pro vlákno.
Můžete jej použít jako
#include <time.h>
struct timespec start, stop;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
/// do something
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &stop);
double result = (stop.tv_sec - start.tv_sec) * 1e6 + (stop.tv_nsec - start.tv_nsec) / 1e3; // in microseconds
Poznámka:Funkce clock() vrací čas CPU pro váš proces, nikoli čas nástěnných hodin. Věřím, že to je to, co OP zajímalo. Pokud je požadován čas nástěnných hodin, pak gettimeofday() je dobrá volba, jak naznačuje dřívější odpověď. clock_gettime() může udělat obojí, pokud to váš systém podporuje; na mém vestavěném systému linux clock_gettime() není podporováno, ale clock() a gettimeofday() ano.
Níže je uveden kód pro získání času nástěnných hodin pomocí gettimeofday()
#include <stdio.h> // for printf()
#include <sys/time.h> // for clock_gettime()
#include <unistd.h> // for usleep()
int main() {
struct timeval start, end;
long secs_used,micros_used;
gettimeofday(&start, NULL);
usleep(1250000); // Do the stuff you want to time here
gettimeofday(&end, NULL);
printf("start: %d secs, %d usecs\n",start.tv_sec,start.tv_usec);
printf("end: %d secs, %d usecs\n",end.tv_sec,end.tv_usec);
secs_used=(end.tv_sec - start.tv_sec); //avoid overflow by subtracting first
micros_used= ((secs_used*1000000) + end.tv_usec) - (start.tv_usec);
printf("micros_used: %d\n",micros_used);
return 0;
}
Chcete-li začít, musíte použít aritmetiku s plovoucí desetinnou čárkou. Jakákoli celočíselná hodnota dělená větší celočíselnou hodnotou bude vždy nula.
A samozřejmě byste to měli udělat něco mezi získáním času začátku a konce.
Mimochodem, pokud máte přístup k gettimeofday
obvykle je upřednostňován před clock
protože má vyšší rozlišení. Nebo možná clock_gettime
který má ještě vyšší rozlišení.