Mesure du temps d'éxecution en C

Portrait de trax

Il peut être utile de mesurer le temps que prends l'exécution d'une partie de code et non de tout le programme. Par exemple pour comparer différentes techniques et optimisations...

Nous pouvons obtenir deux types de temps : le temps d'utilisation du processeur ou le temps d'exécution du programme. Ils peuvent différer pour les raisons suivantes :

  • le programme est exécuter sur une plateforme multi-tâches qui accorde à chaque tâche un temps processeurs.
  • votre programme utilise de entrées/sorties ou des appels systèmes qui ne demande pas ou peu d'utilisation processeurs, mais qui prennent néanmoins du temps.

Dans un premier temps, nous présenterons la fonction > qui permet d'obtenir de le temps d'utilisation processeur.

#include <stdio.h>
#include <stdlib.h>
 
/*========== parttie relative a la mesure du temps ===========*/
#include <sys/times.h>
#include <unistd.h>
typedef struct tms sTms;
typedef struct{
	int debut,fin;
	sTms sdebut, sfin;
}temps_exec;
/*========== parttie relative a la mesure du temps ===========*/
 
void temp(temps_exec *tmps){
    printf("temps réel :\t %d\ntemps utilisateur :\t %ld\ntemps system :\t %ld\n",
		tmps->fin - tmps->debut,
		tmps->sfin.tms_utime - tmps->sdebut.tms_utime,
		tmps->sfin.tms_stime - tmps->sdebut.tms_stime);
}
 
 
void attente (){
    int *temp;
    for (int i = 0 ; i < 420000 ; i++){ /* boucle d'atente */
        temp = (int *)malloc(sizeof(int)*4207);
        free(temp);
        printf("plop\n");
	}
	sleep(1);							/* attent 1 seconde */
}
 
int main(){
    temps_exec temps;
    int top = sysconf(_SC_CLK_TCK); /* recupere le nombre de tips seconde */
 
    temps.debut = times(&temps.sdebut);
	attente();
    temps.fin = times(&temps.sfin);
    temp(&temps);
 
    return 0;
}

Il est possible d'obtenir séparément, grâce a cette même fonction, le temps utilisateur et system, pour le processus père et pour ses fils (voir man).

Avec getrusage :

#include <sys/time.h>
#include <sys/resource.h>
 
void mesureTime (struct rusage *temps0, struct rusage *temps1){
 
        printf("temps utilisateur %d\ntemps systeme %d\n",
                temps1->ru_utime.tv_usec -
                temps0->ru_utime.tv_usec,
                temps1->ru_stime.tv_usec -
                temps0->ru_stime.tv_usec
 
        );
 
}
 
int main(){
        struct rusage temps0;
        struct rusage temps1;
        getrusage(RUSAGE_SELF, &temps0);
// temps à mesurer
        getrusage(RUSAGE_SELF, &temps1);
        mesureTime(&temps0, &temps1);
}