Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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()

alduc1 a écrit :

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 !