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 :

Connaître le temps écoulé depuis le début d'une boucle


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Points : 15
    Points
    15
    Par défaut Connaître le temps écoulé depuis le début d'une boucle
    Bonjour,

    J'aimerais connaître le temps qui s'est écoulé entre le début de ma boucle principale et n'importe quel endroit de cette boucle.
    Il faudrait de plus que ce temps soit précis car ma boucle est rapide (elle s'execute plusieurs fois par seconde).
    Et enfin si le temps pouvait être en secondes ça serait parfait!

    Voilà, merci d'avance pour votre aide!

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Connaître le temps écoulé depuis le début d'une boucle
    Citation Envoyé par rvweb
    J'aimerais connaître le temps qui s'est écoulé entre le début de ma boucle principale et n'importe quel endroit de cette boucle.
    Il faudrait de plus que ce temps soit précis car ma boucle est rapide (elle s'execute plusieurs fois par seconde).
    Et enfin si le temps pouvait être en secondes ça serait parfait!
    C'est pas une FAQ?

    clock() permet de mesurer le temps CPU en ticks. La conversion se fait à l'aide de CLOCKS_PER_SEC. (<time.h>)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 44
    Points : 32
    Points
    32
    Par défaut Re: Connaître le temps écoulé depuis le début d'une boucle
    Citation Envoyé par rvweb
    Il faudrait de plus que ce temps soit précis car ma boucle est rapide (elle s'execute plusieurs fois par seconde).
    Et enfin si le temps pouvait être en secondes ça serait parfait!
    Si ta boucle s'exécute plusieurs fois par seconde, tu ne préfererai pas un temps en milliecondes plutôt ? Car sinon tu auras 0 sec à chaque passage.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    utilises l'utilitaire gprof si c'est exclusivement du c.
    Pour t'en servir et connaitre l'utilisation - man gprof -

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut Re: Connaître le temps écoulé depuis le début d'une boucle
    Citation Envoyé par teska
    Citation Envoyé par rvweb
    Il faudrait de plus que ce temps soit précis car ma boucle est rapide (elle s'execute plusieurs fois par seconde).
    Et enfin si le temps pouvait être en secondes ça serait parfait!
    Si ta boucle s'exécute plusieurs fois par seconde, tu ne préfererai pas un temps en milliecondes plutôt ? Car sinon tu auras 0 sec à chaque passage.
    Il existe un concept qui est la notion de virgule ainsi 1ms peu s'écrire : 0,001s et il faut avouer que ca complique un peu les calculs, mais c'est tres pratique

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    J'utilise des vitesses en m/s dans mon programme, c'est pourquoi je voudrais des secondes. En fait j'aimerais obtenir quelque chose comme 0.001 s/boucle, la fonction clock() est-elle assez précise?
    Est-ce que le code suivant fonctionne?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    clock_t temps = clock();
    // Boucle...
    clock_t t=(clock()-temps)/CLOCKS_PER_SEC;
    Chez moi ça n'a pas l'air (j'essaie de faire avancer un personnage mais cela ne marche pas).

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Si tu es sous linux tu as gettimeofday() qui est extra précis .
    Et aussi, au risque de me répéter l'utilitaire gprof (super pratique) ...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Non, je suis sous Windows, mais clock() ne suffit pas?

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par rvweb
    J'utilise des vitesses en m/s dans mon programme, c'est pourquoi je voudrais des secondes. En fait j'aimerais obtenir quelque chose comme 0.001 s/boucle, la fonction clock() est-elle assez précise?
    Est-ce que le code suivant fonctionne?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    clock_t temps = clock();
    // Boucle...
    clock_t t=(clock()-temps)/CLOCKS_PER_SEC;
    Chez moi ça n'a pas l'air (j'essaie de faire avancer un personnage mais cela ne marche pas).
    1/ clock_t est un entier en general donc tu obtiens 0 c'est normal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double duree = (double)(clock()-t)/(double)(CLOCKS_PER_SEC);
    2/ ensuite regarde la resolution de clock() je ne suis pas sure que ce sois aussi fin que ce que tu veux... il faudra alors faire un moyenne sur plusieurs boucles (et ce sera plus representatif)

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Oui je crois que tu as raison, il me semble que la précision maximale est bien la seconde, donc à chaque boucle t=0.
    Je vais essayer d'utiliser autre chose, comme gprof dont tu m'as parlé.

  11. #11
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par rvweb
    Oui je crois que tu as raison, il me semble que la précision maximale est bien la seconde, donc à chaque boucle t=0.
    Je vais essayer d'utiliser autre chose, comme gprof dont tu m'as parlé.
    C'est de l'ordre de grandeur du centieme de seconde...

    donc apte a mesurer des durees d'au minimum un dizième de seconde, ou alors des moyennes...

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Voici une adresse ou tu peux trouver des informations http://www.rembrandtstr.bocholt.de/m.../libc_296.html.

    Je cite le code cité en exemple que j'ai remanié afin d'affichier les résultats intermédiaires.
    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
     
    #include <time.h>
    #include <stdio.h>
     
    int
    main(int argc,char** argv)
    {
     
    int i;
     
     
    clock_t start, end;
    double elapsed;
     
    start = clock();
     
    printf("START:%i\n",start);
    for(i=0;i<1000;i++)
    	{/*instructions*/}
     
    end = clock();
    printf("END:%i\n",end);
    elapsed = ((double) (end - start)) / CLOCKS_PER_SEC;
    printf("ELAPSED: %G\n",elapsed);
     
    return 1;
    }
    Ce qui en compilant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    E:\home>gcc test.c
     
    E:\home>a.exe
    START:0
    END:0
    ELAPSED: 0
     
    E:\home>
    Ce qui est évidemment pas le résultat attendu, j'ai l'impression que la fonction clock ne fonctionne tout simplement pas sous windows.
    Si tu utilises mingw, utilises gprof ( je radote !!)

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Je ne suis pas sur d'avoir bien compris le principe de gprof. On peut l'utiliser dans un programme, ou alors c'est en quelque sorte un compte rendu qu'on étudie une fois le programme fermé? Si c'est le cas ce n'est pas ce qu'il me faut. Ce qu'il me faut, c'est quelque chose auquel on peut accéder à l'intérieur du programme. Si gprof le permet, pourrais-tu m'expliquer comment on s'en sert dans un programme? Je n'ai pas trouvé de pages où cela est expliqué très clairement...
    Par ailleurs j'ai entendu parler de GetTickCount(), mais je ne sais pas comment l'utiliser et je ne suis pas sûr que cela soit compatible avec Dev-c++, que j'utilise (il me semble que cette fonction est propre à VC). Sinon existe-t-il d'autres méthodes?

    En fait j'attend n'importe quelle proposition pourvu qu'elle fonctionne et qu'elle soit assez simple à utiliser (je débute encore), ou alors bien expliquée!

    Voilà, merci d'avance pour votre aide!

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    258
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 258
    Points : 288
    Points
    288
    Par défaut
    j'ai une solution non portable qui marche sous VC++. Je n'ai jamais testé sous dev-c++.
    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
     
    #include <stdlib.h>
    #include <stdio.h>
     
    namespace tsc
    {
     
    __int64 mt_i;
    __int64* pmt_i = &mt_i;
     
    __declspec(naked) void __stdcall
    writeT()
    {
       __asm
       {
     
          rdtsc
     
          mov      ecx,   pmt_i
     
          mov      [ecx],   eax
          mov      [ecx + 4], edx
     
          ret
     
       }
    }
     
     
    __declspec(naked) void __stdcall
    diffT(double *t)
    {
       __asm
       {
          rdtsc
     
          push   ebp
          mov      ebp,   esp
     
          mov      ecx,   pmt_i
     
          sub      eax,   [ecx]
          sbb      edx,   [ecx + 4]
          mov      [ecx],   eax
          mov      [ecx + 4], edx
       }
     
       *t = (double)mt_i / 1493556;
     
       __asm
       {
          pop      ebp
          ret
       }
    }
     
    }
    Ca s'utilise comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    double duree;
    tsc::writeT();
    // ce que tu veux
    tsc::diffT(&duree); // duree contient le temps depuis l'appel a writeT();
    Je n'ai aucune idée de si ca marche autre part que sous VC++, en tout cas c'est ultra précis.

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par KORTA
    Voici une adresse ou tu peux trouver des informations http://www.rembrandtstr.bocholt.de/m.../libc_296.html.

    Je cite le code cité en exemple que j'ai remanié afin d'affichier les résultats intermédiaires.
    j'ai l'impression que la fonction clock ne fonctionne tout simplement pas sous windows.
    Elle fonctionne, simplement, il faut multiplier les tests pour avoir une mesure significative.

    D'autre part, dans ton code, la boucle est vide. Selon les options d'optimisations en vigueur, elle pourrait très bien être ignorée par le compilateur.

    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
    #include <time.h>
    #include <stdio.h>
     
    int volatile data = 0;
     
    static void test (void)
    {
       int i;
       for(i = 0; i < 1000; i++)
       {
          if (data)
          {
             break;
          }
       }
    }
     
    int main()
    {
       clock_t start, end;
       double elapsed;
     
       {
          unsigned long n;
          unsigned long const N = 1000000ul;
     
          start = clock();
          printf ("   START:%d\n", (int) start);
     
          for (n = 0; n < N; n++)
          {
             test ();
          }
     
          end = clock();
          printf("      END:%d\n",(int)end);
          elapsed = ((double)end - start) / CLOCKS_PER_SEC;
     
          printf("  ELAPSED: %f ms\n",1000 * elapsed);
          printf("UNIT TEST: %f ms\n",1000 * elapsed / N);
       }
     
       system("pause");
     
       return 0;
    }
    Citation Envoyé par Dev-C++
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       START:0
          END:2580
      ELAPSED: 2580.000000 ms
    UNIT TEST: 0.002580 ms
    Appuyez sur une touche pour continuer . . .

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Autant pour moi pour l'info précedente sur clock(), je pensais que clock renvoyait le nombre de ticks depuis le démarrage de la machine ce qui n'est semble t'il pas le cas.... bref!
    A titre indicatif et par curiosité, voici les chiffres que j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    E:\home>a.exe
       START:0
          END:3843
      ELAPSED: 3843.000000 ms
    UNIT TEST: 0.003843 ms
    Appuyez sur une touche pour continuer...
    Autrement
    Citation Envoyé par rvweb
    Je ne suis pas sur d'avoir bien compris le principe de gprof. On peut l'utiliser dans un programme, ou alors c'est en quelque sorte un compte rendu qu'on étudie une fois le programme fermé? Si c'est le cas ce n'est pas ce qu'il me faut. Ce qu'il me faut, c'est quelque chose auquel on peut accéder à l'intérieur du programme. Si gprof le permet, pourrais-tu m'expliquer comment on s'en sert dans un programme? Je n'ai pas trouvé de pages où cela est expliqué très clairement...
    En fait gprof rend compte de la derniere execution de ton executable. Il permet de consulter le temps passé dans chaque fonction et le nombre d'appels effectués.
    pour s'en servir il faut utiliser gcc , puis compiler avec l'option -pg,
    Ensuite executer le programme executable
    pui lancer gprof qui rend compte des temps pasés

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Donc gprof est bien une analyse a posteriori des temps d'execution de mon programme? Je ne peux donc pas l'utiliser dans mon programme pour calculer des temps?
    Sinon j'ai essayé ton code avec clock(), mais si j'ai bien compris tu fais une moyenne sur de nombreux calculs. Or il faudrait que je sache le temps écoulé à chaque boucle (mais si je ne trouve pas de méthode je pourrai toujours faire une moyenne sur plusieurs boucles).
    Quant à la fonction asm de Yabo, Dev-c++ n'a tout simplement pas voulu la compiler car trop d'erreurs de syntaxe. En fait je crois qu'il n'a pas reconnu que c'était de l'asm...
    Là je vais chercher à utiliser QueryPerformanceCounter, si vous pouviez m'en dire plus...

    En tout cas merci pour vos explications et vos codes!

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par rvweb
    Donc gprof est bien une analyse a posteriori des temps d'execution de mon programme? Je ne peux donc pas l'utiliser dans mon programme pour calculer des temps?
    Sinon j'ai essayé ton code avec clock(), mais si j'ai bien compris tu fais une moyenne sur de nombreux calculs. Or il faudrait que je sache le temps écoulé à chaque boucle (mais si je ne trouve pas de méthode je pourrai toujours faire une moyenne sur plusieurs boucles).
    Quant à la fonction asm de Yabo, Dev-c++ n'a tout simplement pas voulu la compiler car trop d'erreurs de syntaxe. En fait je crois qu'il n'a pas reconnu que c'était de l'asm...
    Là je vais chercher à utiliser QueryPerformanceCounter, si vous pouviez m'en dire plus...

    En tout cas merci pour vos explications et vos codes!
    Gprof t'indiquera le temps passé dans chaque fonction et l'arboresence des appels simplement.
    Pour clock(), la méthode a l'air de fonctionner montre nous le code que tu désires utiliser si tu peux , pour qu'on essaye d'y trouver une solution.
    Pour l'asm de devc++ (comme celle de mingw) c'est normal la syntaxe asm est particuliere et est différente de celle qu'on t'a postée précédemment.

  19. #19
    fd
    fd est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 131
    Points : 162
    Points
    162
    Par défaut
    Yaboo :
    pourquoi cette division par 1493556 ?

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Je ne vais pas donner tout mon code, car il y en a beaucoup, mais voici en gros ce que je voudrais faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while (1) { // Boucle principale dans la fonction main()
            float t=0; // Initialisation du temps de référence au début de la boucle
     
            coordonnees();
            affichage();
            perso_mouvements();
            camera_mouvements();
            evenements();
    }
    Puis dans une des fonctions de la boucle principale, perso_mouvements() en l'occurrence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    perso_mouvements() {
         float ecoule=clock()-t; // Calcul le temps écoulé entre la définition de t et l'execution de cette ligne
         // Utilisation de t pour calculer des nouvelles coordonnées du perso
    }
    Voilà, j'espère que c'est plus clair ainsi. Je n'ai pas donné un code que j'utilise mais une "idée" du genre de fonction que j'aimerais trouver, le problème étant je le rappelle que clock() ne donne que des secondes, alors que ecoule serait plutot en millisecondes.

    Sinon si ce que je demande n'est pas réalisable, j'ai pensé faire quelques boucles "test" afin de voir combien de temps met une boucle à s'executer sur un ordinateur donné, puis utiliser cette valeur.
    Et en dernier recours, je pourrai faire une moyenne sur plusieurs boucles, mais cela voudrait dire que les coordonnées de mon perso seraient actualisées toutes les secondes minimum. Pas terrible...

    Voilà, j'espère avoir été assez clair! Et merci!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/05/2012, 14h30
  2. Réponses: 1
    Dernier message: 10/05/2007, 13h22
  3. Réponses: 8
    Dernier message: 15/06/2006, 18h13
  4. calculer le Temp écoulé
    Par ada_b dans le forum SQL
    Réponses: 1
    Dernier message: 30/11/2004, 09h44

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