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

Linux Discussion :

Précision à la milliseconde sous Linux


Sujet :

Linux

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 38
    Points : 46
    Points
    46
    Par défaut Précision à la milliseconde sous Linux
    Bonjour,

    J'essaye de créer un timer avec une précision inférieure à la seconde, je ne souhaite donc pas utiliser la méthode time de la librairie ctime.

    Par contre sur tous les forums ou je vais, la solution est d'utiliser la méthode clock.

    Voici donc mon code de test

    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
     
    #include <iostream>
    #include <ctime>
     
    using namespace std;
     
    int main(){
     
      int i=0;
      time_t start,end;
      start = time(NULL);
     
      clock_t init = clock();
     
      while(i <= 1500){
     
        end = time(NULL);
     
        usleep(1000); //Pause every milliseconds
        std::cout<<"Exec time : "<<end-start<<" seconds"<< endl;
        i++;
     
      }
     
      clock_t finish = clock();
     
      cout<<"Clock: "<< double(clock()) << endl;
      cout<<"Result in millisecond: "<< (double)(finish-init)* 1000 / CLOCKS_PER_SEC << endl;
     
      end = time(NULL);
      cout<<"Exec time  : "<<end-start<<" seconds"<< endl;
     
    }

    Et j'obtiens en sortie:


    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
     
    Exec time : 0 seconds
    Exec time : 0 seconds
    Exec time : 0 seconds
    .....
    Exec time : 7 seconds
    Exec time : 7 seconds
    Exec time : 7 seconds
    Exec time : 7 seconds
    Exec time : 7 seconds
    Exec time : 7 seconds
    Exec time : 7 seconds
    Exec time : 7 seconds
    Exec time : 7 seconds
    Clock: 0
    Result in millisecond: 0
    Exec time  : 7 seconds
     
    Press ENTER to continue.
    Comme on peut le constater le résultat est plutôt bizzare avec un temps d'execution de 7 secondes (donc la methode time fonctionne) la methode clock me retourne n'importe quoi.

    Quelqu'un saurait-il pourquoi ?

    NB: la pause usleep est juste là pour éviter que sa aille trop vite

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    clock ne compte que le temps passé dans le thread, donc si tu fais des sleep, ce n'est pas compté.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 38
    Points : 46
    Points
    46
    Par défaut
    Merci de ta réponse mais si je vire usleep (c'est vrai que sa bloque le proc donc le temps n'est pas compté)

    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
     
    #include <iostream>
    #include <ctime>
     
    using namespace std;
     
    int main(){
     
      int i=0;
      time_t start,end;
      start = time(NULL);
     
      clock_t init = clock();
     
      while(i <= 1500){
     
        end = time(NULL);
     
        //usleep(1000); //Pause every milliseconds
        std::cout<<"Exec time : "<<end-start<<" seconds"<< endl;
        i++;
     
      }
     
      clock_t finish = clock();
     
      cout<<"Clock: "<< double(clock()) << endl;
      cout<<"Result in millisecond: "<< (double)(finish-init)* 1000 / CLOCKS_PER_SEC << endl;
     
      end = time(NULL);
      cout<<"Exec time  : "<<end-start<<" seconds"<< endl;
     
    }
    J'obtiens

    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
     
    Exec time : 4 seconds
    Exec time : 4 seconds
    Exec time : 4 seconds
    Exec time : 4 seconds
    Exec time : 4 seconds
    Exec time : 4 seconds
    Exec time : 4 seconds
    Exec time : 4 seconds
    Exec time : 4 seconds
    Clock: 0
    Result in millisecond: 0
    Exec time  : 4 seconds
     
    Press ENTER to continue.
    Ce qui reste illogique ...
    Le code que j'utilise est quasiment du copier/coller trouver sur plein de post, et est utilisé indépendamment sur Linux/Windows.

    Je me demande donc si y'a pas un bug dans cette classe pourtant fournie avec le compilateur, mon processeur est un centrino qui peut changer de fréquence en fonction de l'utilisation, peut-être que l'erreur provient de là.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Points : 145
    Points
    145
    Par défaut
    ton code marche chez moi mais clock est a 10millisecondes pret.
    tu devrais tester times ( man -s 2 times )

  5. #5
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Sous linux tu as gettimeofday qui te permet d'avoir le temps depuis EPOCH à la microseconde.

  6. #6
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 55
    Points : 54
    Points
    54
    Par défaut
    à prendre ou à laisser
    testé sous Windows-MinGW et Linux-GCC
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [Série] Accès au port série sous linux
    Par ghost dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 10/10/2007, 10h43
  2. Comment désinstaller MySQL sous linux
    Par nahmsath dans le forum Installation
    Réponses: 5
    Dernier message: 18/09/2007, 10h46
  3. Réponses: 9
    Dernier message: 01/08/2007, 12h20
  4. installer jbuilder7 sous linux
    Par rtlinfo34 dans le forum JBuilder
    Réponses: 5
    Dernier message: 30/10/2002, 19h16
  5. Je ne peux établir une connexion cliente sous Linux.
    Par Anonymous dans le forum CORBA
    Réponses: 5
    Dernier message: 16/04/2002, 15h57

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