IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

gettimeofday : comportement etrange


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut gettimeofday : comportement etrange
    Bonjour,

    Je dois mesurer le temps d'execution d'une fonction, j'utilise donc pour cela gettimeofday. Cependant, il arrive que le deuxieme appel gettimeofday retourne une valeur inférieur à celle renvoyé par le premier appel.

    Voici le code de la fonction qui réalise la mesure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    /*
    ** File     : mesureAlgo.c
    ** Author   : kal
    ** Created  : Sun Oct 29 16:31:41 2006
    */
     
     
    #ifdef __cplusplus
    #error This source file is not C++ but rather C. Please use a C-compiler
    #endif
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
    #include <sys/time.h>
    #include <time.h>
     
    #include "mesureAlgo.h"
    #include "couple.h"
     
    /* macros ============================================================== */
    /* constants =========================================================== */
    /* types =============================================================== */
    /* structures ========================================================== */
    /* private variables =================================================== */
    /* private functions =================================================== */
    /* internal public functions =========================================== */
    /* entry points ======================================================== */
     
    long int
    mesureAlgo(couple (* fonction) (int tab[], int i, int j),
               int tab[], int i, int j,
               int nbIter)
    {
      struct timeval *tmDebut = (struct timeval *) malloc(sizeof(struct timeval));
      struct timeval *tmFin = (struct timeval *) malloc(sizeof(struct timeval));
      long int temps;
     
      assert(gettimeofday(tmDebut, NULL) == 0);
     
      for (int x = 0 ; x < nbIter ; x++)
        {
          (* fonction) (tab, i, j);
        }
     
      assert(gettimeofday(tmFin, NULL) == 0);
     
      temps = (tmFin->tv_usec - tmDebut->tv_usec) / (double) nbIter;
      printf("debut = %ld ; fin = %ld ; temps = %ld us\n", tmDebut->tv_usec, tmFin->tv_usec, temps);
     
      free(tmFin);
      free(tmDebut);
     
      return temps;
    }
     
    /* public variables ==================================================== */
    Celle ci est appellé à partir du main suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    /*
    ** File     : creerPoints.c
    ** Author   : kal
    ** Created  : Sun Oct 29 18:14:06 2006
    */
     
     
    #ifdef __cplusplus
    #error This source file is not C++ but rather C. Please use a C-compiler
    #endif
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    #include "mesureAlgo.h"
    #include "generate.h"
    #include "iter.h"
    #include "recursif_1.h"
     
     
    /* macros ============================================================== */
    /* constants =========================================================== */
    /* types =============================================================== */
    /* structures ========================================================== */
    /* private variables =================================================== */
    /* private functions =================================================== */
    /* internal public functions =========================================== */
    void
    usage(const char *arg0)
    {
      fprintf(stderr, "Usage : %s <nbIter>\n", arg0);
      exit(EXIT_FAILURE);
    }
     
    /* entry points ======================================================== */
     
    int
    main(int argc, char **argv)
    {
      if (argc != 2)
        {
          usage(argv[0]);
        }
     
      long int nbIter = strtol (argv[1], NULL, 10);
      int nbZero;
      int instance[] = {10, 50, 100, 500, 1000, 2500, 5000, 10000, 15000, 200000};
     
      srand(time(NULL));
      for (unsigned int i = 0 ; i < sizeof(instance) / sizeof (int) ; i++ )
        {
            int tab[instance[i]];
     
            nbZero = 1 + (int) (instance[i] * (rand() / (RAND_MAX + 1.0)));
            generate(tab, instance[i], nbZero);
     
            printf("I1: %d %ld\n\n",
                   instance[i],
                   mesureAlgo(rechIter, tab, 0, instance[i] - 1, nbIter));
            printf("R1: %d %ld\n\n",
                   instance[i],
                   mesureAlgo(rechRec1, tab, 0, instance[i] - 1, nbIter));
        }
     
      return EXIT_SUCCESS;
     
    }
     
     
    /* public variables ==================================================== */
    Je ne vous copie pas le code de la fonction generate qui s'occupe de placer des 1 et de 0 dans un tableau, sauf si vous en avez besoin.

    Voici un exemple d'execution :

    kal@kal-desktop ~/ALGO $ ./creerPoints 5
    debut = 560453 ; fin = 560455 ; temps = 0 us
    I1: 10 0
    debut = 560590 ; fin = 560615 ; temps = 5 us
    R1: 10 5

    debut = 560668 ; fin = 560672 ; temps = 0 us
    I1: 50 0
    debut = 560716 ; fin = 560844 ; temps = 25 us
    R1: 50 25

    debut = 560906 ; fin = 560911 ; temps = 1 us
    I1: 100 1
    debut = 560955 ; fin = 561198 ; temps = 48 us
    R1: 100 48

    debut = 561291 ; fin = 561315 ; temps = 4 us
    I1: 500 4
    debut = 561360 ; fin = 562542 ; temps = 236 us
    R1: 500 236

    debut = 562684 ; fin = 562727 ; temps = 8 us
    I1: 1000 8
    debut = 562772 ; fin = 565198 ; temps = 485 us
    R1: 1000 485

    debut = 565394 ; fin = 565539 ; temps = 29 us
    I1: 2500 29
    debut = 565588 ; fin = 572534 ; temps = 1389 us
    R1: 2500 1389

    debut = 572855 ; fin = 573146 ; temps = 58 us
    I1: 5000 58
    debut = 573193 ; fin = 665674 ; temps = 18496 us
    R1: 5000 18496

    debut = 666523 ; fin = 667049 ; temps = 105 us
    I1: 10000 105
    debut = 667098 ; fin = 734231 ; temps = 13426 us
    R1: 10000 13426

    debut = 735126 ; fin = 735949 ; temps = 164 us
    I1: 15000 164
    debut = 735997 ; fin = 815849 ; temps = 15970 us
    R1: 15000 15970

    debut = 831513 ; fin = 881612 ; temps = 10019 us
    I1: 200000 10019
    debut = 881731 ; fin = 466671 ; temps = -83012 us
    R1: 200000 -83012
    Je vous laisse constater le dernier résultat de l'exécution...

    Si quelqu'un a une idée, merci d'avance.

  2. #2
    Membre confirmé Avatar de _kal_
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Je viens de résoudre le probleme : je ne prenais pas en compte les secondes lors de la différence de temps, pauvre moi !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fichier .jnlp, comportement etrange
    Par orelero dans le forum JWS
    Réponses: 7
    Dernier message: 24/05/2008, 06h48
  2. Comportement étrange d' apt-get install
    Par Captain_futur dans le forum Debian
    Réponses: 2
    Dernier message: 06/04/2006, 22h57
  3. FindCLose Comportement etrange
    Par Aos dans le forum Langage
    Réponses: 6
    Dernier message: 24/01/2006, 14h20
  4. [LG]repeat/until comportement etrange
    Par scifire dans le forum Langage
    Réponses: 11
    Dernier message: 25/03/2005, 21h56
  5. [langage] Comportement étrange d'une variable
    Par Spaz dans le forum Langage
    Réponses: 6
    Dernier message: 23/04/2004, 11h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo