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 CPU programme C/C++ windows XP


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 22
    Par défaut temps CPU programme C/C++ windows XP
    Bonjour!

    je souhaiterais connaître le temps d'exécution d'un sous-programme en C++ sous windows XP ...Je n'ai jusqu'à présent trouvé que des solutions avec clock() qui évaluent en fait le temps réel ( il augmente lorsque plusieurs tâches sont exécutées en parallèle et ce n'est pas ce qu'on veut ) et non le temps cpu.

  2. #2
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Citation Envoyé par pascalecaire Voir le message
    Bonjour!

    je souhaiterais connaître le temps d'exécution d'un sous-programme en C++ sous windows XP ...Je n'ai jusqu'à présent trouvé que des solutions avec clock() qui évaluent en fait le temps réel ( il augmente lorsque plusieurs tâches sont exécutées en parallèle et ce n'est pas ce qu'on veut ) et non le temps cpu.
    On peut utiliser des fonctions standards du C mais des API comme QueryPerformanceCounter comme son nom le laisse supposer seront plus performantes..
    Voir MSDN+QueryPerformanceCounter
    Sinon GetTickCounts()
    DWORD dwStart = GetTickCount();

    // Stop if this has taken too long
    if( GetTickCount() - dwStart >= TIMELIMIT )
    Cancel();

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Attention, lu dans le MSDN : The GetTickCount function retrieves the number of milliseconds that have elapsed since the system was started. It is limited to the resolution of the system timer

    Autrement dit, la fonction GetTickCount() peut donner le temps écoulé depuis le lancement du processus par exemple mais pas le temps CPU consommé par ce même processus
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Après quelques recherches, la bonne fonction semble être : GetProcessTimes() qui permet de récupérer la date de création du process, la date d'arrêt, le temps CPU en mode noyau et le temps CPU en mode USER.

    http://msdn2.microsoft.com/en-us/library/ms683223.aspx

    Bien sûr, avant, il faut ouvrir le process (par OpenProcess()) s'il s'agit d'un autre process que le process courant
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 22
    Par défaut temps CPU
    justement c'est bien mon problème : avoir le CPU utilisé par la fonction et non le temps écoulé ....

  6. #6
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Citation Envoyé par pascalecaire Voir le message
    justement c'est bien mon problème : avoir le CPU utilisé par la fonction et non le temps écoulé ....
    je ne comprends pas ce que tu veux : la charge CPU ou le temps écoulé ?
    Avec GetTickCount cela se fait très bien je l'ai déjà utilisé.
    On l'utilise pour la synchro des jeux vidéos.

    Citation Envoyé par ram_0000 Voir le message
    Autrement dit, la fonction GetTickCount() peut donner le temps écoulé depuis le lancement du processus par exemple mais pas le temps CPU consommé par ce même processus
    Eh bien on initialise un DWORD avec GetTickCount() et on calcule le delta de temps avec un autre.
    Maintenant pour obtenir le 2ième delta qui donne la fin d'exécution du deuxième process il faut utiliser un SendMessage ou PostMessage ( WM_USER ) win32 pour indiquer que le sous-processus est terminé.
    Ce qui n'est pas du C standard

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Oui mais dans cet exemple, tu calcules effectivement du temps réel et non pas du temps CPU
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    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
     
     
    // open the current process
    HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, TRUE, GetCurrentProcessId());
     
    // check return value (h != NULL)
     
    // read process counters before call
    FILETIME CreationTimeBeforeCall;
    FILETIME ExitTimeBeforeCall;
    FILETIME KernelTimeBeforeCall;
    FILETIME UserTimeBeforeCall;
    BOOL ret = GetProcessTimes(h, &CreationTimeBeforeCall, &ExitTimeBeforeCall, &KernelTimeBeforeCall, &UserTimeBeforeCall);
     
    // check return of GetProcessTimes() call
     
    // appel de la fonction dont on veut mesure le temps CPU
    ma_fonction_que_je_veux_mesurer();
     
    // read process counters after call
    FILETIME CreationTimeAfterCall;
    FILETIME ExitTimeAfterCall;
    FILETIME KernelTimeAfterCall;
    FILETIME UserTimeAfterCall;
    BOOL ret = GetProcessTimes(h, &CreationTimeAfterCall, &ExitTimeAfterCall, &KernelTimeAfterCall, &UserTimeAfterCall);
     
    // check return of GetProcessTimes() call
     
    // close the process handle (no more needed)
    CloseHandle(h);
     
    // analyse des temps retournés
    // le temps CPU et utilisateur passé dans la fonction ma_fonction_que_je_veux_mesurer() est:
    // KernelTimeAfterCall - KernelTimeBeforeCall
    // UserTimeAfterCall - UserTimeBeforeCall 
    // Attention, cette structure est sur 2 DWORD
     
    //typedef struct _FILETIME {
    //   DWORD dwLowDateTime;   /* low 32 bits  */
    //   DWORD dwHighDateTime;  /* high 32 bits */
    //} FILETIME, *PFILETIME, *LPFILETIME;
     
    // donc il faut faire des calcul intermédiaires
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    j'ai mis il y a un certain temps un "clock" temps reel dans les sources (http://c.developpez.com/sources/?pag...DATE_get_clock ici meme...

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pascalecaire Voir le message
    je souhaiterais connaître le temps d'exécution d'un sous-programme en C++ sous windows XP ...Je n'ai jusqu'à présent trouvé que des solutions avec clock() qui évaluent en fait le temps réel ( il augmente lorsque plusieurs tâches sont exécutées en parallèle et ce n'est pas ce qu'on veut ) et non le temps cpu.
    En principe clock() mesure bien le temps CPU.

    Tu peux montrer le code qui montre le contraire ?

  11. #11
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    En principe clock() mesure bien le temps CPU.
    Je ne suis pas sûr que la fonction clock() existe sous Microsoft Windows XP
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    Je ne suis pas sûr que la fonction clock() existe sous Microsoft Windows XP
    Bah, c'est une fonction standard C et elle ne retourne pas (clock_t) -1.
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <limits.h>
     
    int main (void)
    {
       unsigned long volatile cpt = 0;
       printf ("%g\n", (double) clock ());
     
       while (cpt != ULONG_MAX)
       {
          cpt++;
       }
     
       printf ("%g\n", (double) clock ());
     
       return 0;
    }
    Maintenant, qu'elle soit mal implémentée dans mscvcrt.dll et qu'elle de soit pas conforme à la norme, c'est possible...

    http://msdn2.microsoft.com/en-us/lib...30(VS.71).aspx

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 22
    Par défaut temps CPU programme C/C++ windows XP
    avec clock(), si l'on mesure le CPU d'une tâche, celui-ci est différent selon que l'on exécute ou non d'autres tâches en parallèle ce qui prouve bien que l'on ne mesure pas le CPU !!!!

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 22
    Par défaut
    "Bien sûr, avant, il faut ouvrir le process (par OpenProcess()) s'il s'agit d'un autre process que le process courant"


    je ne comprends pas ce qu'il faut faire concrètement.

  15. #15
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par pascalecaire Voir le message
    je ne comprends pas ce qu'il faut faire concrètement.
    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
     
    // open the current process
    HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, TRUE, GetCurrentProcessId());
     
    // check return value (h != NULL)
     
    // read process counters
    FILETIME CreationTime;
    FILETIME ExitTime;
    FILETIME KernelTime;
    FILETIME UserTime;
    BOOL ret = GetProcessTimes(h, &CreationTime, &ExitTime, &KernelTime, &UserTime);
     
    // check return of GetProcessTimes() call
     
    // close the process handle (no more need)
    CloseHandle(h);
     
    // analyse des temps retournés
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 22
    Par défaut
    Pratiquement à l'intérieur d'un code C++ existant et "tournant" sur visual studio 2005, je fais quoi pour connaître les temps CPU ddes deux sous-programmes appelés ?

    merci.

  17. #17
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par pascalecaire Voir le message
    je fais quoi pour connaître les temps CPU ddes deux sous-programmes appelés ?
    Quand tu dis "sous programmes", tu penses "process lancés par la commande CreateProcess(')" ou bien "fonction apellée par appel de fonction" ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par pascalecaire Voir le message
    Pratiquement à l'intérieur d'un code C++ existant et "tournant" sur visual studio 2005, je fais quoi pour connaître les temps CPU ddes deux sous-programmes appelés ?
    Tu demandes dans le forum C++...

Discussions similaires

  1. Temps CPU et temps d'éxécution
    Par t_om84 dans le forum Général Python
    Réponses: 1
    Dernier message: 04/09/2005, 12h27
  2. Temps cpu
    Par chama dans le forum Administration système
    Réponses: 5
    Dernier message: 25/07/2005, 11h41
  3. programmation d'API windows et multithreading
    Par Mastero dans le forum Windows
    Réponses: 8
    Dernier message: 07/03/2005, 23h00
  4. Programmation OpenGl et windows
    Par mr.doug dans le forum OpenGL
    Réponses: 8
    Dernier message: 27/05/2004, 08h31
  5. Questions sur la programmation Api de windows
    Par ApolloCrid dans le forum MFC
    Réponses: 7
    Dernier message: 22/02/2004, 01h43

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