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

Concurrence et multi-thread Java Discussion :

Mesurer le temps d'execution d'un thread?


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut Mesurer le temps d'execution d'un thread?
    Bonjour,

    je suis en train de créer une petite appli avec des tâches lancées par différents thread qui s'executent.
    Ce que j'aurais voulu, c'est pouvoir comparer le temps d'execution de ces threads en lancant une sorte de compteur à leur début, ce dernier s'arrétant une fois les traitements du thread terminé.

    Comment dois-je procéder pour avoir une mesure assez fiable pour chaque thread?

    Merci d'avance!

  2. #2
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Dans ton thread tu as une fonction run qui s'execute au début de ton thread et qui s'arrette à la fin de ton thread.
    Au début de cette fonction, mémorise dans un long System.currentTimeMillis() , et comparle le à ce meme System.currentTimeMillis() juste avant que ton thread ne s'arrette.


    ca donnera a peu près ca :
    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
     
    class MaClasse implements Runnable
    {
     
      MaClasse()
      {
        (...)
      }
      public void run()
      {
        long timeTest = System.currentTimeMillis();
        (... Traitement ...)
        timeTest = System.currentTimeMillis()-timeTest;
      }
    (...)
    }
    voila voila

    bon courage

    mavina

  3. #3
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    currentTimeMillis() n'est pas si fiable que cela. Si tu utilises Java 1.5 ou 1.6, tu peux appeler nanoTime(). Enfin tu peux tout simplement utiliser un profiler comme celui de NetBeans (gratuit, disponible sur netbeans.org). Le profiler te permet de faire plus de choses.

  4. #4
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Ah c'est pas fiable ? Au temps pour moi ;-\

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut
    Ok merci pour ces infos, je vas m'y pencher!

  6. #6
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    En fait cela dépend de l'OS. Par exemple Windows a une résolution de timer de 15 millisecondes. Autrement dit, si tu fais 2 appels à currentTimeMillis() en moins de 15 ms, tu obtiendras 0 ms de différence.

  7. #7
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Ouais c'est assez... embettant tout de même

  8. #8
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    D'où ma remarque sur nanoTime et un profiler.

  9. #9
    Membre confirmé
    Avatar de Glob
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2002
    Messages : 428
    Points : 630
    Points
    630
    Par défaut
    Hello.

    Si currentTimeMillis n'est pas très précis, il est toujours possible de faire exécuter x fois le traitement, de mesurer une fois avant et une fois après, et de faire une moyenne...

  10. #10
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    le probleme c'est que si tu es sous java 1.4.2 (c'est pour ma part le cas), bah tu esun peu coincé, je vais regarder pour ton profiler, ca m'intrigue

    edit pour au dessus : moui à la limite tu auras toujours une marge d'erreur de 15 ms, ce qui peut dans certains cas etre enorme ^^

  11. #11
    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,

    Citation Envoyé par Gfx
    Autrement dit, si tu fais 2 appels à currentTimeMillis() en moins de 15 ms, tu obtiendras 0 ms de différence.
    Voir même 15ms si tu fais tes deux appels juste avant/après le raffraichissement du timer...

    J'ai même souvent remarqué des "erreurs" pouvant aller jusqu'à 32ms...

    a++

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut
    Ok je viens de tester avec nano, mais quelque chose me chiffonne en fait...
    Si je lance plusieurs thread sous mon OS windows, et que je mesure le temps d'execution de chacun, comment pourrais-je avoir un résultat fiable puisque si j'ai bien compris le principe des thread, windows réparti a sa manière un peu de temps pour chaque thread...donc le temps que j'obteindrais ne se ra pas bon puisque qu'entre temps le thread aura été interrompu mais son traitement ne sera pas terminé pour autant...
    Est-ce que je me trompe ou pas?

  13. #13
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Si tu ne précise rien, aucune priorité n'est appliquée à chaque thread par la VM, donc ils sont exécutés "equitablement" normalement ^^

    Citation Envoyé par javadoc
    When code running in some thread creates a new Thread object, the new thread has its priority initially set equal to the priority of the creating thread

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    949
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 949
    Points : 1 857
    Points
    1 857
    Par défaut
    Si je ne me trompe pas, la classe ThreadInfo a quelques méthodes qui pourraient vous être utile.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut
    En effet, je lance mes thread sans aucune priorité, et je ne savais pas que le temps était équitablement réparti, merci pour l'info!
    Je vais regarder ce qu'il y dans la classe threadinfo! Mais a quoi sert-elle?

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut
    Désolé de fare remonter ce "vieux" topic, mais je n'ai pas résolu mon pbm dans le sens ou si j'arrive bien a mesurer le temps lors de l'execution normale, ça se gate lorsque je veux faire des pauses dans mes threads... De ce fait, j'aurais plus besoin d'une sorte de chronométre que de mesurer le temps au début du threa et de le soustraire au temps relevé à la fin du thread...
    Vou avez une idée sur ce que je pourrais utiliser?

  17. #17
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par adiGuba
    Salut,

    Voir même 15ms si tu fais tes deux appels juste avant/après le raffraichissement du timer...

    J'ai même souvent remarqué des "erreurs" pouvant aller jusqu'à 32ms...

    a++
    Une fois j'avais fait un prog de test pour afficher System.currentTimeMillis() en boucle... Et les différences allaient jusqu'à plus de 100ms de différence...
    Par exemple (valeurs bidons):
    123000000
    123000000
    123000000
    123000000
    123000000
    123000172
    123000172
    123000172
    123000172
    123000172
    123000305
    123000305
    ...

    Je ne connaissais pas nanoTime(), merci

    le probleme c'est que si tu es sous java 1.4.2 (c'est pour ma part le cas), bah tu esun peu coincé, je vais regarder pour ton profiler, ca m'intrigue
    En même temps, pourquoi rester sous 1.4.2?

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut
    Personne n'a une petite idée pour moi? Parce que la honnétement je trime dur, impossible de mesurer le temps efficacement lorsque je met mon thread en pause...

  19. #19
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Bonjour,

    Si tu es sous Java 1.5, tu as la classe ThreadInfo.

    Sinon, il ne reste plus que les APIs de l'OS via JNI.

    La plupart des OSs ont des APIs permettant de connaître certaines informations des threads sauf si JAVA gère son propre système de threads.

    Sans indiscrétion, pourquoi désires-tu connaître le temps d'éxecution?

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 40
    Points
    40
    Par défaut
    Merci jowo!

    En fait je lance plusieurs thread qui traitent des données et qui doivent arriver au même résultat, la différence étant que chacun d'eux utilise une méthode différente pour y arriver. Donc, je veux mesurer le temps pour savoir quel thread est le plus rapide pour effectuer son traitement, sachant que les thread partent en même temps.

    Bon, pour cette mesure de temps, ça marche avec ce qui m'a gentiment été soufflé par ceux qui ont répondu, seulement je veux mettre en pause tous ces threads à l'aide d'un bouton (ça n'a aucun interet certes mais c'est pour tester la méthode). Du coup, il est clair que la mesure du temps n'est plus correcte puisqu'il y a le temps de la pause (ou des pauses) à retirer du temsp total mesuré dans le run() du thread...

    Voila tu sais tout!

    Sinon oui je susi bien sous Java 1.5, mais j'ai pas l'impression que threadInfo me soit d'une grande utilité...

Discussions similaires

  1. Réf : Mesurer le temps d 'execution d 'une requete
    Par akrabmehdi dans le forum SQL
    Réponses: 1
    Dernier message: 10/07/2007, 20h48
  2. Mesurer le temps d'éxécution d'une méthode
    Par bhahmed dans le forum C++Builder
    Réponses: 19
    Dernier message: 02/12/2006, 18h00
  3. mesure de temps d'execution
    Par jamalmoundir dans le forum C
    Réponses: 6
    Dernier message: 29/05/2006, 12h59
  4. [Stratégie] Mesurer le temps d'exécution d'une requête
    Par nice dans le forum Général Java
    Réponses: 5
    Dernier message: 29/01/2006, 17h53
  5. [Test][Perf]Mesure du temps d'execution différente 2 fois de suite
    Par debdev dans le forum Tests et Performance
    Réponses: 11
    Dernier message: 22/07/2005, 12h04

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