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

API, COM et SDKs Delphi Discussion :

Calculer Temps d'execution


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre du Club Avatar de smail21
    Profil pro
    Inscrit en
    Février 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2005
    Messages : 152
    Points : 61
    Points
    61
    Par défaut Calculer Temps d'execution
    Bonjour
    dans mon petit programme en delphi5, je dois calculer le temps d'execution d'une procedure, alors j'ai crée une table où j'enregistre les temps de début d'execution et de fin, et la durée entre les deux temps (la différence).
    bon le problème est le temps d'execution du programme est en millisecondes, alors que ce que j'ai comme résultat est une durée : 00 h: 00m: 00s
    donc comment faire pour avoir la durée en millisecondes?

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Bonjour

    Citation Envoyé par smail21
    donc comment faire pour avoir la durée en millisecondes?
    Tu peux utiliser la fonction GetTickCount qui renvoie des valeurs en millisecondes.

    [edit]
    Tu peux également regarder cette entrée dans la FAQ, si tu as besoin d'un chronométrage assez précis.
    [/edit]

    @+ Claudius

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    normalement la valeur DateTime de delphi vas jusqu'à la microseconde.

    donc, si vous avez fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DateDeb := Datetime;
    DateFin := Datetime;
    Temp := dateFin - DateDEb;
    Vous devriez avoir le temps en milliseconde.

    Le problème vient plutôt du format de date. allez voir la fonctionn Format Date time

    Citation Envoyé par "Aide delphi
    FormatDatetime
    Formate un objet TDateTime.

    Unité

    SysUtils

    Catégorie

    routines date/heure

    Syntaxe Delphi :

    function FormatDateTime(const Format:string;DateTime:TDateTime):string;overload;
    function FormatDateTime(const Format:string;DateTime:TDateTime;const FormatSettings:TFormatSettings):string;overload;

    Syntaxe C++:

    externPACKAGE AnsiString__ fastcall FormatDateTime(constAnsiStringFormat,System::TDateTimeDateTime);
    externPACKAGE AnsiString__ fastcall FormatDateTime(constAnsiStringFormat,System::TDateTimeDateTime,constTFormatSettings
    FormatSettings);

    Description

    FormatDateTime formate l'objet TDateTime fournie par DateTime en utilisant le format indiquépar Format.Pour plus d'informations,voir Chaînes de format date/heure.

    Si la chaîne spécifiée par le paramètre Format est vide,l'objet TDateTime est implicitement formatéavec le spécificateur de format 'c'.

    La première forme de FormatDateTime n'est pas adaptée aux threads car elle utilise les informations de localisation contenues dans les variables globales.La seconde forme de FormatDateTime,qui est adaptée aux threads,fait référence aux informations de localisation contenues dans le paramètre FormatSettings.Avant d'appeler la forme adaptée aux threads de FormatDateTime,vous devez placer les informations de localisation dans FormatSettings.Pour placer un ensemble de valeurs locales par défaut dans FormatSettings,appelez GetLocaleFormatSettings.

    Chaînes de format date-heure
    Spécificateur Affichage
    c Affiche la date,en utilisant le format défini par la variable globale ShortDateFormat,puis l'heure,en utilisant le format défini par la variable globale LongTimeFormat.L'heure n'est pas affichée si la valeur date-heure indique précisément minuit.
    d Affiche le numéro du jour sans le préfixer d'un zéro (1 à31).
    dd Affiche le numéro du jour en le préfixant d'un zéro (01 à31).
    ddd Affiche le jour abrégé(Dim àSam)en utilisant les chaînes fournies par la variable globale ShortDayNames.
    dddd Affiche le jour complet (Dimanche àSamedi)en utilisant les chaînes fournies par la variable globale LongDayNames.
    ddddd Affiche la date en utilisant le format fourni par la variable globale ShortDateFormat.
    dddddd Affiche la date en utilisant le format fourni par la variable globale LongDateFormat.
    e (Windows uniquement)Affiche l'année de la période/ère en cours sous la forme d'un nombre,sans le préfixer d'un zéro (localisations japonaise,coréenne et taïwanaise seulement)
    ee (Windows uniquement)Affiche l'année de la période/ère en cours sous la forme d'un nombre,précédépar un zéro (localisations japonaise,coréenne et taïwanaise seulement)
    g (Windows uniquement)Affiche la période/ère sous la forme d'une abréviation (localisations japonaise,coréenne et taïwanaise seulement)
    gg (Windows uniquement)Affiche complètement la période/ère.(Localisations japonaise,coréenne et taïwanaise seulement)
    m Affiche le numéro du mois sans le préfixer d'un zéro (1 à12).Si le spécificateur m suit immédiatement un spécificateur h ou hh,les minutes sont affichées plutôt que le numéro du mois.
    mm Affiche le numéro du mois en le préfixant d'un zéro (01 à12).Si le spécificateur mm suit immédiatement un spécificateur h ou hh,il provoque l'affichage des minutes plutôt que du numéro du mois.
    mmm Affiche le mois abrégé(Jan àDéc)en utilisant les chaînes fournies par la variable globale ShortMonthNames.
    mmmm Affiche le mois complet (Janvier àDécembre)en utilisant les chaînes fournies par la variable globale LongMonthNames.
    yy Affiche le numéro de l'année sous la forme de deux chiffres (00 à99).
    yyyy Affiche l'année sous la forme de quatre chiffres (0000-9999).
    h Affiche l'heure sans la préfixer d'un zéro (0 à23).
    hh Affiche l'heure en la préfixant d'un zéro (00 à23).
    n Affiche les minutes sans les préfixer d'un zéro (0 à59).
    nn Affiche les minutes en les préfixant d'un zéro (00 à59).
    s Affiche les secondes sans les préfixer d'un zéro (0 à59).
    ss Affiche les secondes en les préfixant d'un zéro (00 à59).
    z Affiche les millisecondes sans les préfixer d'un zéro (0 à999).
    zzz Affiche les millisecondes en les préfixant d'un zéro (0 à999).
    t Affiche l'heure en utilisant le format fourni par la variable globale ShortTimeFormat.
    tt Affiche l'heure en utilisant le format fourni par la variable globale LongTimeFormat.
    etc.

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Si ça t'intéresse voiçi le code d'un objet Chronomètre créé à partir des infos de la Faq, et s'agissant d'un objet on peut le décliner en autant de var Chrono1, chrono2, ... chronoN : oChrono qu'on souhaite ce qui permet de chronométrer des étapes imbriquées les unes dans les autres :
    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
     
    type oChrono = object
                        Frequency     : Int64;    // Fréquence du compteur hautes performances.
    		    FStart,FStop  : Int64;    // Valeurs du compteur au début et à la fin du chrono.
    		    FElapsed      : Extended; // Durée en secondes
                        procedure Top; //début du chronométrage
                        function  Mis : Extended ; // Fin et conversion du temps écoulé en ms.
                   end;
     
    procedure oChrono.Top;
    begin     If Not QueryPerformanceFrequency(Frequency)
              Then Raise Exception.Create('Pas de compteur hautes performances.');
              QueryPerformanceCounter(FStart);
    end;
     
    function  oChrono.Mis : Extended ; // Fin et conversion du temps écoulé en millisecondes.
    begin     QueryPerformanceCounter(FStop);
              FElapsed := 1000*(FStop-FStart)/Frequency;
              Result:=FElapsed;
    end;
    // Utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure Blabla;
    var      i, j : integer; chrono1,chrono2 : oChrono;
    begin   Application.ProcessMessages;
              Chrono1.Top;
              for i:=1 to 100000 do  // boucle principale à chronométrer
              begin  .......
                       chrono2.Top;
                       for j:=1 to 200000 do // boucle imbriquée à chronométrer
                       begin .........
                       end;
                       label2.caption:='Boucle imbriquéé : mis : '+FloatToStrf(Chrono2.Mis,ffFixed,10,2)+' ms';  
              end;
              label1.caption:='Boucle ppale : Mis : '+FloatToStrf(Chrono1.Mis,ffFixed,10,2)+' ms';
    end;
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Membre du Club Avatar de smail21
    Profil pro
    Inscrit en
    Février 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2005
    Messages : 152
    Points : 61
    Points
    61
    Par défaut
    merci pour vos réponses je vais essayer le formatage de la date!
    car je crois que la commande GetTickCount ne me convient pas, elle me donne des durées croissantes donc je penses qu'elel fait un chronometrage continue et non une Remise à zero après chaque chrono.

    to be continued ...

  6. #6
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    GetTickCount compte le nombre de millisecondes depuis le démarrage du PC, donc il faut avant chaque chronométrage, stocker sa valeur dans une variable intermédiaire, et ensuite faire une soustraction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    t:=GetTickCount;
    Procedure1;
    ShowMessageFmt('Procedure1 a mis %d ms.',[GetTickCount-t]);
     
    //...
     
    t:=GetTickCount;
    Procedure2;
    ShowMessageFmt('Procedure2 a mis %d ms.',[GetTickCount-t]);

  7. #7
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Pour infos qq remarques intéressantes sur le sujet (QueryPerformanceCounter):
    Il reste que le problème de la variabilité des performances est absolument inévitable puisque Windows est un système préemptif qui peut prendre le contrôle de l'ordinateur à tout moment.
    ...
    la suite

  8. #8
    Membre du Club Avatar de smail21
    Profil pro
    Inscrit en
    Février 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2005
    Messages : 152
    Points : 61
    Points
    61
    Par défaut
    avec tout ces codes, je cros que le problème n'est pas résolu car :
    1-on m'a suggéré d'utiliser le composant Ttimer, alors qu'en lisant son help il ne me convient pas
    2- j'ai essayé ce que m'a proposé Capjack, alors j'ai tout le temps une durée de 0 ms, c'est anormal je trouve!


  9. #9
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Voilà comment je procède. C'est très bateau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var
      Start, Elapsed: Cardinal;
    begin
      Start := GetTickCount;
     
      [... Ton traitement ...]
     
      Elapsed := GetTickCount - Start;  
    end;
    Elapsed donne en millisecondes la durée de ton traitement.
    C'est d'ailleurs le principe de CapJack.

    @+ Claudius

  10. #10
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    La méthode que te propose la FAQ sur le chronométrage précis ne te convient pas ?

    Personnellement, lorsque je veux un résultat précis j'utilise cette de la FAQ ou encore celle cité par Cl@udius

  11. #11
    Membre du Club Avatar de smail21
    Profil pro
    Inscrit en
    Février 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2005
    Messages : 152
    Points : 61
    Points
    61
    Par défaut
    merci pour votre aide
    j'ai opté depuis tout à l'heure pour celle de Clodius
    encore merci

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

Discussions similaires

  1. comment calculer temps d'execution d'un prgrm
    Par amrirobot dans le forum C++
    Réponses: 7
    Dernier message: 07/01/2011, 18h05
  2. Calcul du temps d'execution en millisecondes
    Par Yakurena dans le forum C++
    Réponses: 2
    Dernier message: 18/04/2007, 01h45
  3. Calculer temps d'execution du programme
    Par Jeane dans le forum C++
    Réponses: 4
    Dernier message: 21/03/2007, 21h02
  4. Calculer le temps d'execution
    Par smail21 dans le forum Langage
    Réponses: 21
    Dernier message: 06/05/2006, 16h06
  5. comment calculer le temps d'execution
    Par passion_info dans le forum C++Builder
    Réponses: 1
    Dernier message: 09/06/2005, 09h13

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