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

Langage Delphi Discussion :

[D7] Comment mesurer le temps d'exécution d'un bloc de code ?


Sujet :

Langage Delphi

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut [D7] Comment mesurer le temps d'exécution d'un bloc de code ?
    Bonjour,

    Je souhaiterais mesurer le temps d'exécution de plusieurs blocs de code dans une application écrite en Delphi 7.
    Ces calculs doivent avoir une précision de l'ordre de la micro seconde voire la nano seconde si c'est possible

    Je pensais utiliser des :
    - TTimer mais appremment ils ne servent pas à ça
    - opérations sur des TDateTime grâce notamment à la fonction Now mais la précision ne sera pas assez importante.

    Malgré mes recherches sur les forums & FAQ je ne trouve pas.
    Pouvez-vous m'aider ?
    Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Points : 318
    Points
    318
    Par défaut
    Faut pas trop rêver en terme de precision sur un os multitache non orienté temps réel.

    Il y a la fonction gettickcount qui est facile à utiliser, sinon il y a des api win32 pour gérer des timers plus précis mais n'ai pas le code sous la main.

    Sinon il est possible d'utiliser un profiler.

  3. #3
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    Bonjour,
    Pour l'utilisation du GetTickCount :

    GetTickCount renvoie le nombre de millisecondes depuis que ton PC est allumé.
    Toi tu sais quand le bloc de code commence et quand il se finit, tu veux donc faire une soustraction entre ces deux valeurs.

    Soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
      Start : Integer;
    begin
      Start := GetTickCount;
      // Bloc de code à tester
      // (...)
     
      Showmessage('Top Chrono ! '+IntToStr(GetTickCount-Start)+' millisecondes écoulées.');
     
    end;
    Comme l'a dit cpdump les résultats ne peuvent être fiables à 100% il faudra donc faire X Tests et faire une moyenne de ces tests (20 tests donnent une bonne idée déjà)

    Si ton bloc de code est trop rapide à exécuter (- de 10 millisecondes) il faudra le prendre à part et le mettre dans une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     for i:=1 to 35000 do ...
    Pour avoir des valeurs plus probantes.

    Amuse toi bien !

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par cpdump
    Sinon il est possible d'utiliser un profiler.
    J'ai déjà utilisé AQTime & ProDelphi mais comme l'expliquait -Sylvain Leray- je désire obtenir un temps moyen sur une échelle que je peux faire varier (apparemment ces profilers ne laissent pas cette possibilité ?).

    Merci de vos réponses, je vais faire quelques tests...

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Ok ça fonctionne bien comme prévu.
    Ceci dit, à la compilation j'ai l'avertissement suivant :
    [Avertissement] formMenu.pas(75): Combinaison de types signés et non signés - opérandes agrandis
    L'instruction concernée est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tempsCourant := GetTickCount - tempsCourant;
    La variable tempsCourant est de type Integer

    Je comprends le message mais qu'est-ce que je peux faire ?

  6. #6
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    GetTickCount renvoie un Cardinal (non signé) et ton tempsCourant est probablement déclaré Integer (signé). Il te faut donc déclarer tempsCourant en Cardinal.

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Ok j'ai compris le pourquoi du comment.

    Merci à tous.

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 24/06/2008, 15h57
  2. Mesurer le temps d'exécution d'un bout de code
    Par Floréal dans le forum C++
    Réponses: 4
    Dernier message: 06/04/2007, 09h46
  3. mesurer le temps d'exécution d'une fonction
    Par Fonzy007 dans le forum C
    Réponses: 12
    Dernier message: 28/12/2006, 17h27
  4. Comment mesurer le temps d'une fonction ?
    Par Battosaiii dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 05/10/2006, 16h37
  5. Réponses: 2
    Dernier message: 04/04/2006, 11h46

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