temps écoulé rapide sur linux

Je cherche un moyen rapide d’obtenir le temps écoulé entre deux appels d’une fonction en C.

J’ai envisagé d’utiliser des jiffies, mais ils ne sont pas disponibles en utilisateur. Alors, devrais-je utiliser getimeofday () ou existe-t-il le moyen le plus rapide de le faire?

Je ne m’intéresse qu’au temps écoulé entre deux appels, à utiliser dans un outil de référence.

Jetez un coup d’œil à clock_gettime , qui permet d’accéder aux timers haute résolution.

time.h le temps processeur via clock() from time.h Pour obtenir des valeurs utiles, convertissez en millisecondes via CLOCKS_PER_SEC :

 clock_t start = clock(); // [...] clock_t end = clock(); unsigned long millis = (end - start) * 1000 / CLOCKS_PER_SEC; 

Oui, gettimeofday () suffirait si vous voulez trouver le temps écoulé. Si vous avez besoin de trouver le temps processeur, vous pouvez utiliser clock (). Dans de nombreux cas, les deux approches donneraient un résultat similaire (sauf en cas de sumil ou d’attente dans le code). Un exemple de clock () peut être trouvé ici:
http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_19.html

Si vous êtes sur une architecture x86 / x64 et que vous utilisez un seul processeur, vous pouvez envisager de lire le compteur d’horodatage sur le processeur pour obtenir un nombre de cycles. Wikipedia a plus d’informations . Notez que cette approche est moins utile si votre application s’exécute sur plusieurs processeurs, puisque chaque processeur aura son propre TSC. Méfiez-vous également de la mise à l’échelle des fréquences si vous décidez de convertir des cycles -> unités de temps.

Si votre kernel prend en charge gettimeofday() tant que vsyscall (appel de système virtuel), alors cela sera plus rapide que d’appeler un appel système normal tel que clock() . Voir la présentation d’Andrea Arcangeli pour des informations sur le fonctionnement de vsyscalls.

Un ajout tardif, cependant, le temps disponible sur n’importe quel Linux / Unix peut être un moyen plus léger d’obtenir ce que vous voulez. Voici 2 exemples

 time ls -l stuff* ls: stuff*: No such file or directory 0.01s real 0.00s user 0.00s system time -c run_script.csh` ... real 1m22.38s user 0m14.67s sys 0m1.06s 

Ce qui suit fonctionne pour moi sur CentOS 6:

 #include  #include  #include  #if ! defined(_POSIX_C_SOURCE) # error "_POSIX_C_SOURCE undefined" #endif #if _POSIX_C_SOURCE < 199309L # error "_POSIX_C_SOURCE < 199309L" #endif int main(int, char**){ struct timespec start, stop; struct timespec stop; if(clock_gettime(CLOCK_MONOTONIC, &start )) goto err_out; if(clock_gettime(CLOCK_MONOTONIC, &stop )) goto err_out; printf("start == {tv_sec: %d, tv_nsec: %d}\n", start.tv_sec, start.tv_nsec); printf("stop == {tv_sec: %d, tv_nsec: %d}\n", stop.tv_sec, stop.tv_nsec ); printf("stop.tv_nsec - start.tv_nsec == %d\n", stop.tv_nsec - start.tv_nsec); return EXIT_SUCCESS; err_out: perror("clock_gettime"); return EXIT_FAILURE ; } 

... bien que cela nécessite librt :

 $ make dur cc dur.c -o dur /tmp/cc1yF58x.o: In function `main': dur.c:(.text+0x1c): undefined reference to `clock_gettime' dur.c:(.text+0x4e): undefined reference to `clock_gettime' collect2: ld returned 1 exit status make: *** [dur] Error 1 $ LDFLAGS="-lrt" make dur cc -lrt dur.c -o dur $ ./dur start == {tv_sec: 206247, tv_nsec: 411717209} stop == {tv_sec: 206247, tv_nsec: 411759791} stop.tv_nsec - start.tv_nsec == 42582