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

Java Discussion :

Calculer le temps d'exécution


Sujet :

Java

  1. #1
    chouki
    Invité(e)
    Par défaut Calculer le temps d'exécution
    Bonjour,
    je voudrais essayer de calculer le temps d'exécution d'une méthode est il possible de le faire en java ?

    Cordialement

  2. #2
    Membre chevronné
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Par défaut
    Un moyen simple est d'utiliser la méthode currentTimeMillis ou nanoTime de la classe System et faire simplement une différence. Sinon, tu peux aussi utiliser des outils de monitoring comme HPROF (utilisable via un argument dans le lancement de la JVM). http://java.sun.com/developer/techni...ing/HPROF.html

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Par défaut
    C'est intéressant pour optimiser ses algorithmes .

  4. #4
    chouki
    Invité(e)
    Par défaut
    Avec CurrentTimeMillis avec deux exécution sa donne 2 résultats différents!!!

  5. #5
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 681
    Par défaut
    Bien sur! C'est le principe même!

    Tu fais un currentTimeMillis en début de l'opération a mesurer et tu met le résultat dans une variable. A la fin du traitement tu fais la différence entre un nouveau currentTimeMillis et la valeur sauvegardée pour obtenir le temps en ms.

  6. #6
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    Citation Envoyé par chouki Voir le message
    Avec CurrentTimeMillis avec deux exécution sa donne 2 résultats différents!!!
    Citation Envoyé par Uther Voir le message
    Bien sur! C'est le principe même!
    Tu fais un currentTimeMillis en début de l'opération a mesurer et tu met le résultat dans une variable. A la fin du traitement tu fais la différence entre un nouveau currentTimeMillis et la valeur sauvegardée pour obtenir le temps en ms.
    Je pense qu'il voulait dire qu'il a testé deux fois son application et qu'il a obtenu des résultats sensiblement différents.

    Attention pour le calcul des très petites valeurs (genre une fonction qui ne prend qu'une milliseconde): currentTimeMillis ou nanoTime ne sont pas forcément précis à la milliseconde (respectivement la nanoseconde) près.
    Dans certains cas, tu peux même avoir des imprécisions de l'ordre de 15msec.

    C'est pourquoi il est en règle générale préférable de faire des tests de performance avec les outils prévus pour (comme Hprof, mais également avec les outils intégrés dans certains IDE: c'est le cas avec NetBeans ; j'imagine que l'équivalent doit exister sur Eclipse).

    L'autre possibilité pour réduire les imprécisions est de mesurer le temps pris par l'exécution de la fonction non pas pour une exécution, mais pour 1000 exécutions à la suite (dans une boucle). Tu n'as ensuite plus qu'à diviser le delta de temps obtenu entre le début et la fin de la boucle par 1000.

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Par défaut
    Il vaut mieux faire une moyenne de toute façon. Le système d'exploitation et même la JVM peuvent engendrer ces différences en temps d'exécution.

  8. #8
    chouki
    Invité(e)
    Par défaut
    Avec ce bout de code
    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
     
     
    import java.util.*;
    public class GetExecutionTimes
    {
      public GetExecutionTimes(){}
      public static void main(String args[])
      {
        long startTime = System.currentTimeMillis();
        GetExecutionTimes ext=new GetExecutionTimes();
        ext.callMethod();
        long endTime = System.currentTimeMillis();
        System.out.println("Total elapsed time in execution of method callMethod() is :"+ (endTime-startTime));
      }
      public void callMethod(){
        System.out.println("Calling method");
        for(int i=1;i<=10;i++)
        {
          System.out.println("Value of counter is "+i);
        }
      }
    }
    le résultat de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     System.out.println("Total elapsed time in execution of method callMethod() is :"+ (endTime-startTime));
    est 0

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Il me semble que tout a déjà été dit :
    Citation Envoyé par nouknouk Voir le message
    Attention pour le calcul des très petites valeurs (genre une fonction qui ne prend qu'une milliseconde): currentTimeMillis ou nanoTime ne sont pas forcément précis à la milliseconde (respectivement la nanoseconde) près.
    Dans certains cas, tu peux même avoir des imprécisions de l'ordre de 15msec.
    a++

  10. #10
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    Citation Envoyé par chouki Voir le message
    le résultat de [...]est 0
    Effectivemet: le temps nécessaire à l'exécution de ta fonction est très petit, en dessous de la milliseconde.
    D'où l'idée d'appeller non pas une seul fois ta fonction, mais beaucoup de fois (ci-dessous 100 000 fois) et de faire une moyenne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        for (int i=0; i < 100000; ++i) {
            ext.callMethod();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("Total elapsed time in execution of method callMethod() is :"+ ((endTime-startTime)/100000));
      }
    EDIT: grilled

  11. #11
    chouki
    Invité(e)
    Par défaut
    hein!! , je n'y comprends rien TOUJOURS 0

  12. #12
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 681
    Par défaut
    Peut être que une itération se fait en moins de 1 ms.
    Essaie avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("Total elapsed time in execution of method callMethod() is :"+ ((double)(endTime-startTime)/100000) + "ms");

  13. #13
    chouki
    Invité(e)
    Par défaut
    Peut étre qu'il faut viser + haut que 100000 je vais tester

  14. #14
    chouki
    Invité(e)
    Par défaut
    C'est mieux ainsi
    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
     
     
    import java.util.*;
    public class GetExecutionTimes
    {
      public GetExecutionTimes(){}
      public static void main(String args[])
      {
        long startTime = System.currentTimeMillis();
        GetExecutionTimes ext=new GetExecutionTimes();
     
            ext.callMethod();
     
        long endTime = System.currentTimeMillis();
     
        System.out.println("debut"+ (endTime));
        System.out.println("fin"+ (startTime));
        System.out.println(endTime-startTime);
     }
     
      public void callMethod(){
       // System.out.println("Calling method");
        for(int i=1;i<=100000;i++)
        {
         System.out.println(i);
        }
      }
    }
    Dernière modification par chouki ; 27/02/2009 à 18h47.

  15. #15
    Membre averti
    Femme Profil pro
    Chercheur en informatique
    Inscrit en
    Octobre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 13
    Par défaut calcul du temps CPU
    Bonjour,

    comment peut-on calculer le temps CPU de plusieurs programmes qui s’exécutent au même temps. dans mon cas je travaille sur des agents (jade) en java donc toutes mes classes s’exécutent simultanément et je sais pas quand est ce que je dois mettre le System.currentTimeMillis().

    Cordialement

  16. #16
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Par défaut
    Citation Envoyé par sassion Voir le message
    Bonjour,

    comment peut-on calculer le temps CPU de plusieurs programmes qui s’exécutent au même temps. dans mon cas je travaille sur des agents (jade) en java donc toutes mes classes s’exécutent simultanément et je sais pas quand est ce que je dois mettre le System.currentTimeMillis().

    Cordialement
    Utilise plutôt des programmes de traçage, tel que décrit dans ce tuto http://arodrigues.developpez.com/tut...ation-java-ee/

  17. #17
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 181
    Billets dans le blog
    1
    Par défaut
    Pour y parvenir, il y a un moyen tous simple, relever l'heure avant la première instruction de ton programme, et après la fin de l’exécution de programme, ensuite, faire la différence entre les deux, tous ça en utilisant des instance de la class java.util.Date :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    java.util.Date uDate = new java.util.Date (System.currentTimeMillis ()); //Relever l'heure avant le debut du progamme (en milliseconde) 
    Date dateFin = new Date (System.currentTimeMillis()); //Relever l'heure a la fin du progamme (en milliseconde) 
    Date duree = new Date (System.currentTimeMillis()); //Pour calculer la différence
    duree.setTime (dateFin.getTime () - uDate.getTime ());  //Calcul de la différence
    long secondes = duree.getTime () / 1000;
    long min = secondes / 60;
    long heures = min / 60;
    long mili = duree.getTime () % 1000;
    secondes %= 60;
    System.out.println ("Temps passé durant le traitement : \nHeures : " + heures + "\nMinutes : " + min + "\nSecondes : " + secondes + "\nMilisecondes : " + mili + "\n");
    Ca devrait marcher, A+ .

  18. #18
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par mohamine1989 Voir le message
    Pour y parvenir, il y a un moyen tous simple, relever l'heure avant la première instruction de ton programme, et après la fin de l’exécution de programme, ensuite, faire la différence entre les deux
    Sauf que ca ne marche pas en environnement multithreadé
    D'ou l'utilité des outils de debug qui sont fait pour ca (et qui ont necessité pas mal de developpement) et qui seront donc beaucoup plus efficaces que des instrumentations faites vite fait.

  19. #19
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 181
    Billets dans le blog
    1
    Par défaut
    Merci beaucoup pour cette précisiant, je n'y est pas pensée, j'y ferai attention la prochaine fois .
    A+ .

Discussions similaires

  1. [C++] Calcul du temps d'exécution
    Par Castagnems dans le forum C++
    Réponses: 7
    Dernier message: 12/01/2012, 12h46
  2. Calculer le temps d'exécution d'une requête
    Par BRAUKRIS dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 16/03/2007, 12h59
  3. Calculer le temps d'exécution d'un script
    Par pomgnon dans le forum C
    Réponses: 2
    Dernier message: 28/12/2006, 15h49
  4. Réponses: 3
    Dernier message: 11/03/2006, 15h35
  5. [C#] Calcul du temps d'exécution.
    Par lozzko dans le forum Windows Forms
    Réponses: 4
    Dernier message: 12/06/2005, 16h12

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