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 :

temps d'execution - clock ()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut temps d'execution - clock ()
    Bonjour,


    Voilà je cherche à comparer le temps d'execution pour comparer 2 méthodes qui recherchent le pgcd de 2 nombres.

    J'ai décidé d'utiliser la fonction clock (), je sais que cette fonction donne une valeur du temps approximative mais vu que je cherche le pgcd de int_max et int_max - 1 le temps d'exécution est important (environ 30 secondes pour la première méthode).

    Le problème est le suivant :

    PGCD = 1 duree methode 1 : 30839000000 ns
    PGCD = 1 duree methode 2 : 0 ns

    Process returned 0 (0x0) execution time : 30.886 s
    Press any key to continue.


    le temps d'execution de la 2ème méthode est nulle, et j'arrive pas à savoir si c'est parceque :

    - la deuxième méthode est tellement rapide que clock arrive pas à calculer son temps d'éxecution.
    - Il y a un souci au niveau du code.




    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    /* --------------------------------------------------------------------------
       Fonction : Comparer la complexite temporelle de 2 methode de calcul pour le
                  PGCD
       -------------------------------------------------------------------------- */
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include <limits.h>
     
    /* --------------------------------------------------------------------------
       permuter ()
       --------------------------------------------------------------------------
       Role : Permute 2 nombre (long)
       -------------------------------------------------------------------------- */
    void permuter (long *x, long *y)
    {
       long tmp = *x;
       *x = *y;
       *y = tmp;
    }
     
    /* --------------------------------------------------------------------------
       trouver_pgcd_methode_1 ()
       --------------------------------------------------------------------------
       Role : Retourne le PGCD de 2 nombres par la méthode de decrementation
       -------------------------------------------------------------------------- */
    long trouver_pgcd_methode_1 (long x, long y)
    {
       long pgcd;
     
       if (x < y)
       {
          permuter (&x, &y);
       }
     
       if (y == 0)
       {
          pgcd = x;
       }
       else
       {
          pgcd = y;
          while (x % pgcd != 0 || y % pgcd != 0)
          {
             pgcd--;
          }
       }
     
       return pgcd;
    }
     
    /* --------------------------------------------------------------------------
       trouver_pgcd_methode_2 ()
       --------------------------------------------------------------------------
       Role : retourne le PGCD de 2 nombre par la formule mathematique
       -------------------------------------------------------------------------- */
    long trouver_pgcd_methode_2 (long x, long y)
    {
       long tmp;
     
       if (x < y)
       {
          permuter (&x, &y);
       }
     
       while (y != 0)
       {
          tmp = x;
          x = y;
          y = tmp % x;
       }
     
       return x;
    }
     
    /* --------------------------------------------------------------------------
       comparer_complexite_temporelle ()
       --------------------------------------------------------------------------
       Role : Comparer la complextité temporelle des 2 methodes
       -------------------------------------------------------------------------- */
    void comparer_complexite_temporelle (long x, long y)
    {
       clock_t temps_initial_methode;
       clock_t temps_final_methode;
       clock_t duree_methode_1;
       clock_t duree_methode_2;
       long pgcd1;
       long pgcd2;
     
       temps_initial_methode = clock ();
       pgcd1 = trouver_pgcd_methode_1 (x, y - 1);
       temps_final_methode = clock ();
       duree_methode_1 = temps_final_methode - temps_initial_methode;
     
       temps_initial_methode = clock ();
       pgcd2 = trouver_pgcd_methode_2 (x, y - 1);
       temps_final_methode = clock ();
       duree_methode_2 =  temps_final_methode - temps_initial_methode;
     
       printf ("PGCD = %ld duree methode 1 : %10.0lf ns\n", pgcd1, (double) duree_methode_1 /
                                                  CLOCKS_PER_SEC * 1000000000.0);
       printf ("PGCD = %ld duree methode 2 : %10.0lf ns\n", pgcd2, (double) duree_methode_2 /
                                                  CLOCKS_PER_SEC * 1000000000.0);
    }
     
    int main (int argc, char **argv)
    {
       comparer_complexite_temporelle (INT_MAX, INT_MAX - 1);
     
       return EXIT_SUCCESS;
    }

    Merci.

  2. #2
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    salut

    si tu es sous windows utilise plutôt les fonctions de windows

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    /* --------------------------------------------------------------------------
       Fonction : Comparer la complexite temporelle de 2 methode de calcul pour le
                  PGCD
       -------------------------------------------------------------------------- */
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include <limits.h>
     #include <windows.h>
     
    /* --------------------------------------------------------------------------
       permuter ()
       --------------------------------------------------------------------------
       Role : Permute 2 nombre (long)
       -------------------------------------------------------------------------- */
    void permuter (long *x, long *y)
    {
       long tmp = *x;
       *x = *y;
       *y = tmp;
    }
     
    /* --------------------------------------------------------------------------
       trouver_pgcd_methode_1 ()
       --------------------------------------------------------------------------
       Role : Retourne le PGCD de 2 nombres par la méthode de decrementation
       -------------------------------------------------------------------------- */
    long trouver_pgcd_methode_1 (long x, long y)
    {
       long pgcd;
     
       if (x < y)
       {
          permuter (&x, &y);
       }
     
       if (y == 0)
       {
          pgcd = x;
       }
       else
       {
          pgcd = y;
          while (x % pgcd != 0 || y % pgcd != 0)
          {
             pgcd--;
          }
       }
     
       return pgcd;
    }
     
    /* --------------------------------------------------------------------------
       trouver_pgcd_methode_2 ()
       --------------------------------------------------------------------------
       Role : retourne le PGCD de 2 nombre par la formule mathematique
       -------------------------------------------------------------------------- */
    long trouver_pgcd_methode_2 (long x, long y)
    {
       long tmp;
     
       if (x < y)
       {
          permuter (&x, &y);
       }
     
       while (y != 0)
       {
          tmp = x;
          x = y;
          y = tmp % x;
       }
     
       return x;
    }
     
    /* --------------------------------------------------------------------------
       comparer_complexite_temporelle ()
       --------------------------------------------------------------------------
       Role : Comparer la complextité temporelle des 2 methodes
       -------------------------------------------------------------------------- */
    void comparer_complexite_temporelle (long x, long y)
    {
       clock_t temps_initial_methode;
       clock_t temps_final_methode;
       clock_t duree_methode_1;
       clock_t duree_methode_2;
       long pgcd1;
       long pgcd2;
     
       temps_initial_methode = clock ();
       pgcd1 = trouver_pgcd_methode_1 (18000000000, 22000000);
       temps_final_methode = clock ();
       duree_methode_1 = temps_final_methode - temps_initial_methode;
     
        LARGE_INTEGER a,b,c;
     
     
     QueryPerformanceFrequency(&c);
       QueryPerformanceCounter(&a);
       pgcd2 = trouver_pgcd_methode_2 (18000000000, 22000000);
       QueryPerformanceCounter(&b);
       duree_methode_2 =  b.QuadPart - a.QuadPart;
     
       printf ("PGCD = %ld duree methode 1 : %f ns\n", pgcd1, (double) duree_methode_1 / CLOCKS_PER_SEC * 1000000.0);
       printf ("PGCD = %ld duree methode 2 : %f ns\n", pgcd2, (double) duree_methode_2 / c.QuadPart * 1000000.0);
    }
     
    int main (int argc, char **argv)
    {
       comparer_complexite_temporelle (INT_MAX, INT_MAX - 1);
     
       return EXIT_SUCCESS;
    }
    sinon sous linux il existe la structure tms et les fonctions qui vont avec:
    http://www.opengroup.org/onlinepubs/...ons/times.html

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    - la deuxième méthode est tellement rapide que clock arrive pas à calculer son temps d'éxecution.
    Oui, l'algorithme d'Euclide de la seconde méthode est beaucoup plus efficace
    - Il y a un souci au niveau du code.
    Non, je ne pense pas

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par acx01b Voir le message
    salut

    si tu es sous windows utilise plutôt les fonctions de windows


    sinon sous linux il existe la structure tms et les fonctions qui vont avec:
    http://www.opengroup.org/onlinepubs/...ons/times.html
    Bonsoir,

    Alors oui je suis sous windows mais j'aurais voulu autant que faire se peut utiliser une fonction qui soit POSIX. J'ai essayé avec QueryPerformanceCounter () ça marche effectivement bien, le seul souci c'est le windows.h :/

    Sinon au niveau de times () si je comprends bien la librairie sys/times.h est spécifique à linux.

    Va falloir que je demande au prof celle que je peux utiliser.

    Merci

    Citation Envoyé par diogene Voir le message
    Oui, l'algorithme d'Euclide de la seconde méthode est beaucoup plus efficace
    Non, je ne pense pas
    C'est bien ce que je me disais, merci


    A votre avis la fonction gettime de dos.h peut elle être utilisable pour ce genre de travail (même si elle est pas POSIX) et qu'elle ne donne que les centièmes de secondes au plus précis.

    Merci

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Bon au final je vais utiliser l'api windows

    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    /* --------------------------------------------------------------------------
       Fonction : Comparer la complexite temporelle de 2 methode de calcul pour le
                  PGCD
       -------------------------------------------------------------------------- */
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <time.h>
    #include <limits.h>
     #include <windows.h>
     
    /* --------------------------------------------------------------------------
       permuter ()
       --------------------------------------------------------------------------
       Role : Permute 2 nombre (long)
       -------------------------------------------------------------------------- */
    void permuter (long *x, long *y)
    {
       long tmp = *x;
       *x = *y;
       *y = tmp;
    }
     
    /* --------------------------------------------------------------------------
       trouver_pgcd_methode_1 ()
       --------------------------------------------------------------------------
       Role : Retourne le PGCD de 2 nombres par la méthode de decrementation
       -------------------------------------------------------------------------- */
    long trouver_pgcd_methode_1 (long x, long y)
    {
       long pgcd;
     
       if (x < y)
       {
          permuter (&x, &y);
       }
     
       if (y == 0)
       {
          pgcd = x;
       }
       else
       {
          pgcd = y;
          while (x % pgcd != 0 || y % pgcd != 0)
          {
             pgcd--;
          }
       }
     
       return pgcd;
    }
     
    /* --------------------------------------------------------------------------
       trouver_pgcd_methode_2 ()
       --------------------------------------------------------------------------
       Role : retourne le PGCD de 2 nombre par la formule mathematique
       -------------------------------------------------------------------------- */
    long trouver_pgcd_methode_2 (long x, long y)
    {
       long tmp;
     
       if (x < y)
       {
          permuter (&x, &y);
       }
     
       while (y != 0)
       {
          tmp = x;
          x = y;
          y = tmp % x;
       }
     
       return x;
    }
     
    /* --------------------------------------------------------------------------
       comparer_complexite_temporelle ()
       --------------------------------------------------------------------------
       Role : Comparer la complextité temporelle des 2 methodes
              On utilise le timer cpu haute resolution <window.h>
       -------------------------------------------------------------------------- */
    void comparer_complexite_temporelle (long x, long y)
    {
       LARGE_INTEGER start_ticks;
       LARGE_INTEGER stop_ticks;
       LARGE_INTEGER counts_per_sec;
       long duree_methode_1;
       long duree_methode_2;
       long pgcd1;
       long pgcd2;
     
       /* Frequence a laquelle le compteur est mis a jour */
       QueryPerformanceFrequency(&counts_per_sec);
     
       /* Valeur du compteur au debut */
       QueryPerformanceCounter(&start_ticks);
     
       pgcd1 = trouver_pgcd_methode_1 (x, y);
     
       /* Valeur du compteur a la fin */
       QueryPerformanceCounter(&stop_ticks);
     
       /* Temps d'execution */
       duree_methode_1 =  stop_ticks.QuadPart - start_ticks.QuadPart;
     
       QueryPerformanceCounter(&start_ticks);
       pgcd2 = trouver_pgcd_methode_2 (x, y);
       QueryPerformanceCounter(&stop_ticks);
       duree_methode_2 =  stop_ticks.QuadPart - start_ticks.QuadPart;
     
       printf ("PGCD = %ld | duree methode 1 : %7.2lf micro-secondes\n", pgcd1,
              (double) duree_methode_1 / counts_per_sec.QuadPart * 1000000.0);
       printf ("PGCD = %ld | duree methode 2 : %11.2lf micro-secondes\n", pgcd2,
              (double) duree_methode_2 / counts_per_sec.QuadPart * 1000000.0);
    }
     
    int main (int argc, char **argv)
    {
       comparer_complexite_temporelle (INT_MAX, INT_MAX - 1);
     
       return EXIT_SUCCESS;
    }

    Par contre je comprends pas le .QuadPart

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    LARGE_INTERGER est une union, pas un long long.
    QuadPart est le champ de type long long de cette union.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    salut

    si tu veux être portable je pense que ceci suffit:

    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
    void start_chrono();
    unsigned long get_elapsed_time(); // en ns ?
     
    void start_chrono() {
    #ifdef WIN32
    ...
    code windows
    #else
    ...
    code linux / mac / unix
    #endif
    }
     
    unsigned long get_elapsed_time() {
    #ifdef WIN32
    ...
    code windows
    #else
    ...
    code linux / mac / unix
    #endif
    }

  8. #8
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    LARGE_INTERGER est une union, pas un long long.
    QuadPart est le champ de type long long de cette union.

    Merci, j'ai un bouquin de C qui parle des unions, je vais y jeter un coup d'oeil.

  9. #9
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par exhortae Voir le message
    Alors oui je suis sous windows mais j'aurais voulu autant que faire se peut utiliser une fonction qui soit POSIX.
    Quand on compare deux algorithmes au niveau de leur rapidite, on ne fait pas qu'un seul appel. Il faut faire les mesures sur un grand nombre d'appels (si possible avec des donnees variables) et faire une moyenne (on peut meme avoir un ecart-type). La resolution temporelle de clock() n'est alors plus un probleme.

  10. #10
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par DaZumba Voir le message
    Quand on compare deux algorithmes au niveau de leur rapidite, on ne fait pas qu'un seul appel. Il faut faire les mesures sur un grand nombre d'appels (si possible avec des donnees variables) et faire une moyenne (on peut meme avoir un ecart-type). La resolution temporelle de clock() n'est alors plus un probleme.
    J'ai pas bien compris ce que tu veux dire.

    1) Faire une boucle, à l'intérieur de cette boucle appeler chaque fois la fonction et noter la durée du temps d'exécution dans un tableau, puis faire la moyenne à partir de ce tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for (i = ...)
    {
    start = clock ()
    fonction_calcul_pgcd ()
    end = clock
    t[i] = end - start
    }
     
    ...
    On va se retrouver avec le problème d'avant où la durée sera tellement brève à chaque appel que la durée moyennesera = 0.

    2) sauvegarder le temps de départ, faire une boucle avec appel à la fonction puis sauvegader le temps à la sortie de la boucle, faire la différence des temps.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    start = clock
    for (i = ...)
    {
    fonction_calcul_pgcd
    }
    end = clock
     
    duree = end - start
    Cette méthode ne serait applicable qu'a la deuxième méthode (algorithme d'euclide), parceque pour la première méthode 1 seul appel prends déjà 30 seconde sur mon PC avec (INT_MAX, INT_MAX - 1).

  11. #11
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par exhortae Voir le message
    J'ai pas bien compris ce que tu veux dire.
    C'est ton point 2 qui est exact. Il est adapté à des mesures de durées courtes.

    2) sauvegarder le temps de départ, faire une boucle avec appel à la fonction puis sauvegader le temps à la sortie de la boucle, faire la différence des temps.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    start = clock
    for (i = ...)
    {
    fonction_calcul_pgcd
    }
    end = clock
     
    duree = end - start
    Attention, la durée d'un seul appel est (end - start) / ( (double) n_appel) où n_appel est le nombre d'itérations. Puisque la première fonction est lente, tu peux te contenter d'un seul appel, mais pour la deuxième, il faudra en faire beaucoup plus.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/07/2007, 18h38
  2. limit et temps d'execution avec oracle et PHP
    Par dor_boucle dans le forum Oracle
    Réponses: 20
    Dernier message: 10/12/2005, 14h31
  3. Temps d'execution d'une requête
    Par Maglight dans le forum Bases de données
    Réponses: 3
    Dernier message: 27/01/2005, 08h38
  4. [VB.NET] Temps d'éxécution d'une page...
    Par Webman dans le forum ASP.NET
    Réponses: 3
    Dernier message: 04/06/2004, 12h20
  5. Connaitre le temps d'execution d'un pgm ?
    Par yacinechaouche dans le forum C
    Réponses: 7
    Dernier message: 27/01/2003, 20h57

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