Pages : 1
#1 Le 31/08/2012, à 14:14
- Pizz
[résolu] fonction clock()
Bonjour,
J'ai un problème très bizarre : j'essaye de calculer le temps d'exécution d'un bloc de code en C.
Pour ça, j'encadre ce bloc avec
clock_begin=clock();
et
clock_end=clock();
Je calcule ensuite le temps d'exécution par
((double) (clock_end - clock_begin) )/ CLOCKS_PER_SEC;
Je vérifie le résultat avec la fonction time().
Le problème, c'est que le résultat est correct sur mes machines (linux mint 11 et 13 64 bits), et sur une autre (dérivée de redhat), mais pas sur le serveur de calcul que j'utilise (CentOS 5.7).
Voilà mon code :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
clock_t clock_begin, clock_end; // nb de clocks
time_t gbegin, gend; // temps calculé par time
clock_begin=clock();
time(&gbegin);
//----------------------------------------------//
// Execution d'une fonction quelconque
//----------------------------------------------//
printf("début... \n");
long int i=0,k=0;
for (i=0; i<1000000000; i++)
{
k++;
}
printf("fin. \n");
//----------------------------------------------//
clock_end=clock();
time(&gend);
printf("clock begin = %d", (int) clock_begin);
printf(" clock end = %d", (int) clock_end);
printf(" CLOCKS_PER_SEC = %ld \n\n", CLOCKS_PER_SEC );
double dt = ((double) (clock_end - clock_begin) )/ CLOCKS_PER_SEC;
printf("dt par clock = %g \n", dt);
printf("dt par la fonction time() = %g \n", ( (double) (gend -gbegin)));
return 0;
}
le résultat sur ma machine est :
début...
fin.
clock begin = 0 clock end = 2070000 CLOCKS_PER_SEC = 1000000
dt par clock = 2.07
dt par la fonction time() = 2
Et sur le serveur :
début...
fin.
clock begin = 0 clock end = 225 CLOCKS_PER_SEC = 1000000
dt par clock = 0.000225
dt par la fonction time() = 2
Avez-vous une idée du problème ? Ou une autre suggestion pour calculer le temps d'éxécution d'un bloc de code
?
Merci beaucoup !
Dernière modification par Pizz (Le 31/08/2012, à 15:56)
Hors ligne
#2 Le 31/08/2012, à 14:31
- compte supprimé
Re : [résolu] fonction clock()
Salut,
J'ai arrêté d'utilisé clock(). Voici le code que j'utilise :
void CPU_Time(short status)
{
struct timeval tv;
static double tcpu;
double x,m,h,s;
gettimeofday(&tv, 0);
if (status == 0)
tcpu = -(tv.tv_sec + tv.tv_usec * 1.0E-6);
else
{
tcpu += tv.tv_sec + tv.tv_usec * 1.0E-6;
if (tcpu < 60.0)
fprintf(stdout,"Temps de simulation : %.2f s\n",tcpu);
else if (tcpu < 3600.0)
{
m = floor(tcpu / 60.0);
s = round(tcpu - m * 60.0);
fprintf(stdout,"Temps de simulation : %.2f s (%d:%d)\n",
tcpu,(int)m,(int)s);
}
else
{
h = floor(tcpu / 3600.0);
x = tcpu - h * 3600.0;
m = floor(x / 60.0);
s = round(x - m * 60.0);
fprintf(stdout,"Temps de simulation : %.2f s (%d:%d:%d)\n",
tcpu,(int)h,(int)m,(int)s);
}
}
}
qui s'utilise de la façon suivante :
CPU_Time(0);
/* traitement a mesurer */
CPU_Time(1);
Sinon si c'est pour une mesure précise de temps très courts (<< seconde) il y a RDTSC :
/* lecture du TSC (Ttime Stamp Counter) */
#if defined(__i386__)
/* version 32b */
unsigned long long rdtsc()
{
unsigned long long x;
__asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
return x;
}
#elif defined(__x86_64__)
/* version 64b */
unsigned long long rdtsc(void)
{
unsigned hi, lo;
__asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}
#endif
qui est un compteur incrémenté au rythme de l'horloge CPU. Ça ne marche peut être qu'avec un processeur intel ???
Dernière modification par alduc1 (Le 31/08/2012, à 14:35)
#3 Le 31/08/2012, à 15:55
- Pizz
Re : [résolu] fonction clock()
Salut,
J'ai arrêté d'utilisé clock(). Voici le code que j'utilise :void CPU_Time(short status) { struct timeval tv; static double tcpu; double x,m,h,s; gettimeofday(&tv, 0);
Ça suffira dans mon cas, merci !
Cependant, j'ai l'impression qu'on calcule le temps d'exécution et non le temps CPU avec gettimeofday, c'est bien ça ?
Hors ligne
#4 Le 31/08/2012, à 16:45
- compte supprimé
Re : [résolu] fonction clock()
oui le temps d'exécution, CPU c'est pour faire bling bling !
Pages : 1