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 :

Structure de temps portable


Sujet :

C++

  1. #1
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut Structure de temps portable
    Bonjour à tous,

    J'ai un code windows qui doit être porté sous linux et macos.

    Dans ce code est utilisé une structure SYSTEMTIME comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SYSTEMTIME st;
    GetSystemTime(&st);
    Je n'ai pas besoin de faire de calcul sur la date récupérée juste être capable de ressortir les différentes infos. La résolution à la millisecond est impérative.
    Je recherche donc un équivalent à tm mais avec les millisecondes en plus.

    La structure étant instancié très souvent ( à minima tte les 40ms) j'aimerais rester sur quelque chose très simple et ne pas traîner un ensemble de classe comme avec boost::posix_time::ptime

    J'ai bien pensé à redéfinir la même structure quand elle n'existe pas , mais se pose alors la question du remplissage de la structure.

    Des idées ?

    Merci
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Et un truc comme cela : How to get the elapsed real time

    Mais après quelques tests sous Windows:
    1) #if defined(NTDDI_WIN8) && NTDDI_VERSION >= NTDDI_WIN8 ne fonctionne pas sous Visual 2013
    2) GetSystemTimeAsFileTime est souvent la plus rapide, mais devrait donner un temps imprécis. Moi je n'ai jamais eu de problème

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    La précision de telles fonctions sous Windows est la même durée qu'un quantum de thread: 1/64e de seconde, c'est-à-dire 15.625ms.
    À ma connaissance, GetSystemTime() fait juste GetSystemTimeAsFileTime() puis FileTimeToSystemTime().

    Sous *n*x, j'ai du mal à trouver une fonction de temps qui soit plus précise qu'une seconde. Possiblement ftime(), puis il doit y avoir des fonctions de conversion...
    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.

  4. #4
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    En C++11 avec chrono :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    auto duration = std::chrono::steady_clock::now().time_since_epoch(); // Il existe différentes clocks : std::system_clock, std::high_resolution_clock
    auto t = std::chrono::duration<T, std::milli>(duration).count(); // Remplacer T par le type voulu

  5. #5
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Sous *n*x, j'ai du mal à trouver une fonction de temps qui soit plus précise qu'une seconde. Possiblement ftime(), puis il doit y avoir des fonctions de conversion...
    gettimeofday

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    As-tu regardé du coté de l'en-tête <chrono> et plus particulièrement du coté de std::time_point

    Car, le fait est que, même si c'est instancié très souvent, tu ne vas sans doute pas garder ces instances très souvent, et que la précision à la milli seconde ne pose absolument aucun problème (cela dépend d'ailleurs du système d'exploitation, mais une précision de l'ordre de la µs est généralement possible).

    Par contre, il serais dommage de t'emm... der à recréer quelque chose alors qu'une fonctionnalité équivalente est fournie par la bibliothèque standard! Et toutes les fonctions qui te permettent d'effectuer les calculs intéressants sont fournies en prime
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    chrono semble être une solution envisageable.

    Merci pour vos réponses
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    Bonjour,

    Une des fonctions à la fois rapide et précise est RDTSC, cette instruction assembleur existe sur presque tous les processeurs (Intel, Amd, ARM, PowerPC), ne prends qu'1 ou 2 cycles en exécution et mesure des cycles d'horloge (donc précision en ns).
    Seul inconvénient sa portabilité.
    Exemple en QNX :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    uint64_t cps = SYSPAGE_ENTRY(qtime)->cycles_per_sec; // la fréquence du processeur
    uint64_t cycle1=ClockCycles();  // ou __rdtsc();
    // traitement à mesurer
    uint64_t cycle2=ClockCycles();  // ou __rdtsc();
    cout << "temps écoulé en ns" << 1000000000uLL*(cycle2-cycle1)/cps;

  9. #9
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Il faut également faire attention à la conversion des cycles en temps car la fréquence du processeur peut changer durant l'exécution (économie d'énergie, mode turbo). Une solution est de la fixer avant de lancer le programme.

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

Discussions similaires

  1. maitriser le temps d'une structure condition
    Par frankyT dans le forum LabVIEW
    Réponses: 8
    Dernier message: 15/02/2010, 14h51
  2. Structure pour un emploi du temps
    Par morgan47 dans le forum Langage
    Réponses: 14
    Dernier message: 14/11/2009, 09h55
  3. Initialisation portable d'une structure
    Par Thierry Chappuis dans le forum C
    Réponses: 8
    Dernier message: 20/09/2007, 14h18
  4. choix de structure emploi du temps
    Par franfr57 dans le forum Requêtes
    Réponses: 6
    Dernier message: 19/04/2006, 20h26
  5. Temps précis portable
    Par KORTA dans le forum C
    Réponses: 3
    Dernier message: 16/09/2003, 13h17

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