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 averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    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
    Points : 368
    Points
    368
    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 habitué
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Points : 156
    Points
    156
    Par défaut
    C'est intéressant pour optimiser ses algorithmes .
    Développeur en devenir.

    A la recherche de toute source approfondissant Merise, UML, Java, l'objet, les design patterns hors GOF et le développement en général.

    Recherche également des informations sur les techniques de développement et les bonnes pratiques en terme de programmation en entreprise.

    "On en apprends beaucoup plus par la confrontation que par la conciliation"

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

  5. #5
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 560
    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 560
    Points : 15 487
    Points
    15 487
    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 : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    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.
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2008
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 234
    Points : 156
    Points
    156
    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.
    Développeur en devenir.

    A la recherche de toute source approfondissant Merise, UML, Java, l'objet, les design patterns hors GOF et le développement en général.

    Recherche également des informations sur les techniques de développement et les bonnes pratiques en terme de programmation en entreprise.

    "On en apprends beaucoup plus par la confrontation que par la conciliation"

  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 sénior
    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
    Points : 23 190
    Points
    23 190
    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 : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    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
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

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

  12. #12
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 560
    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 560
    Points : 15 487
    Points
    15 487
    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 à l'essai
    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
    Points : 15
    Points
    15
    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 émérite
    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
    Points : 2 657
    Points
    2 657
    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 confirmé

    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
    Points : 519
    Points
    519
    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 chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    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 confirmé

    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
    Points : 519
    Points
    519
    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