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 :

CPU time de Threads


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Points : 14
    Points
    14
    Par défaut CPU time de Threads
    Bonjour,

    Je developpe actuellement un chrono en Java qui doit permettre de faire remonter a l'utilisateur le temps CPU utilise par un thread et j'ai comme un probleme.
    Mon chrono doit calculer le temps CPU utilise par un thread. Java possede des outils pour faire ca, il s'agit d'objets lies interface ThreadMXBean. Mais voici le code qui pose probleme :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    public class Test {
     
       public Test() {}
     
       public class A extends Thread {
          public void run() {
             Random g1 = new Random();
             for(int i = 0; i < 1.0E8; i++) {
                g1.nextDouble();
             }
             System.out.println(getClass() + "  id : " + Thread.currentThread().getId() + " time : " + ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime()/1.0E9));
          }
       }
     
       public class B extends Thread {
          public void run() {
             Random g1 = new Random();
             for(int i = 0; i < 1.0E8; i++) {
                g1.nextDouble();
             }
             System.out.println(getClass() + "  id : " + Thread.currentThread().getId() + " time : " + (ManagementFactory.getThreadMXBean().getCurrentThreadCpuTime()/1.0E9));
          }
       }
     
       public void runOn() {
          AbstractChrono chronoCpu = new GlobalCPUTimeChrono();
          AbstractChrono chronoSys = new SystemTimeChrono();
          chronoSys.init();
          chronoCpu.init();
     
          A a = new A();
          B b = new B();
          a.start();
          b.start();
          try {
             a.join();
             b.join();
          }
          catch(InterruptedException e) { e.printStackTrace(); }
     
          System.out.println("GlobalTime : " + chronoCpu.format());
          System.out.println("SystemTime : " + chronoSys.format());
       }
     
       public static void main (String[] args) {
          Test c = new Test();
          c.runOn();
       }
    }

    Ici je cree des objects de deux classes qui sont des Threads que je fais tourner dans le vide (je genere des nombres dans le vide) et a qui je demande d'afficher leur temps d'execution quand il ont fini. L'objet chronoCpu renvoie le tems d'execution de la machine viruelle, et chronoSys renvoie le temps systeme qu'a dure l'execution, ces deux chronos marchent bien soint testes, valides et tout et tout, la fonction format affiche les temps de maniere bien jolie.
    Voici le resultat que j'obtiens a l'execution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Test$A  id : 9 time : 2.53
    class Test$B  id : 10 time : 2.6
    GlobalTime : 0:0:2.61
    SystemTime : 0:0:2.62
    Le probleme est que la somme des deux temps CPU des threads ne devrait pas etre superieure au temps CPU de la JVM et encore moins au temps systeme donc y a une couille dans le potage.
    Bon alors je comprend peut-etre pas bien comment fonctionne le ThreadMXBean et a priori mon probleme vient de la.

  2. #2
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    Ceci devrait t'aider :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    public class CpuTime
    {
        private long nanoStart;
        private ThreadMXBean thd;
        private long previousTime;
        private long currentTime;
     
     
        public CpuTime()
        {
    	nanoStart = 0L;
    	thd = ManagementFactory.getThreadMXBean();
    	previousTime = 0L;
    	currentTime = 0L;
        }
     
        /**
           starts the chronometer
        */
        public void start()
        {
    	nanoStart = thd.getCurrentThreadUserTime();
        }
     
        /**
           stops the chronometer
        */
        public void stop()
        {
    	long nanoStop = thd.getCurrentThreadUserTime();
    	previousTime = currentTime;
    	currentTime = nanoStop - nanoStart;
        }
     
        /**
           Returns the CPU time beetween the last call of start and stop in seconds
        */
        public double getSeconds()
        {
    	return (currentTime)/1E9;
        }
     
        /**
           Returns the CPU time beetween the last call of start and stop in milliseconds
        */
        public long getMilliSeconds()
        {
    	return (long) Math.round((currentTime)/1E6);
        }
     
        /**
           Returns the CPU time beetween the last call of start and stop in nanoseconds
        */
        public long getNanoSeconds()
        {
    	return currentTime;
        }
     
     
        /**
           Returns the CPU time beetween the last call of start and stop under string format (hh:mm:ss)
        */
        public String getTime()
        {
     
    	long rest = getMilliSeconds();
    	long ms = rest % 1000;
    	rest = rest / 1000; // expressed in sec
    	String time = ms + " ms";
     
    	String[] unit = {"sec","min","hours"};
    	long[] val = {60,60,24};
     
    	for (int i = 0; i < unit.length && rest > 0; i++)
    	{
    	    long t = rest % val[i];
    	    rest = rest / val[i];
    	    time = t + " " + unit[i] + " " + time;
    	} 
     
    	if (rest > 0)
    	    time = rest + " days " + time;
     
    	return time;
        }
     
    }

    Y faut encore mettre les importations, et la doc est pas terrible, j'ai fait ça à l'arrache lol mais ça devrait fonctionner...

    Par ailleurs la somme des temps CPU des deux threads peut selon moi être supérieure au temps CPU de la JVM, car quand le thread tourne le CPU se consacre directement au thread et pas à la JVM, si ce n'était pas le cas tu aurais tout le temps des temps de 0 pour le thread...
    On a toujours besoin d'un plus bourrin que soi

    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    Merci de t'interresser a mon probleme.

    J'ai teste le code que tu m'as donne et j'ai le meme probleme. J'ai fait un test un peu different du precedent. D'abord j'ai legerement adapte la classe que tu m'as donnee a un environnement multithread (extends Thread) puis j'y ai rajoute une methode (run) qui genere des nombres pendant longtemps puis qui affiche un getSeconds quand elle se termine. J'ai egalement modifie le nom des methodes start et stop pour ne pas interferer avec les fonction du Thread.

    En parallele voici ma methode main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       public static void main (String[] args) {
          CpuTime c = new CpuTime();
          c.start();
          c.startChro();
          CpuTime d = new CpuTime();
          d.start();
          d.startChro();
          try {
             Thread.currentThread().sleep(1000);
          }
          catch(Exception e) { e.printStackTrace(); }
          c.stopChro();
          d.stopChro();
       }
    Donc la je demande a mon prog principal de dormir pendant une seconde et je prend le CPU time consome par chacun des deux threads pendant cette seconde, voici le resultat :
    Plus globalement j'ai fait d'autres tests et j'ai l'impression que Java ne fais pas la difference entre les threads, j'ai essaye d'utiliser la fonction getThreadUserTime(int ThreadID) et j'obtient le meme resultat.

    On peux effectivement penser que le temps de la JVM puisse etre inferieur a la somme des deux temps des thread, mais ca parrait impossible pour le temps systeme...

  4. #4
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    Je ne comprends pas bien en quoi les résultats qui sont affichés ne te satisfont pas...
    On a toujours besoin d'un plus bourrin que soi

    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    Imagines que je lance 10 threads dans mon programme, si je fais tourner mon prog chacun des threads va me renvoyer 1.0sec de temps cpu (j'ai teste). Or ce qui m'interresse moi c vraiment le temps passe sur le processeur, afin de determiner si un thread pompe plus de calcul qu'un autre par exemple. La j'ai l'impression que cette fonction me renvoie le temps passe, tout betement, pas le temps cpu...

  6. #6
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    Tu crées bien un CPUTime pour chacun de tes threads?
    On a toujours besoin d'un plus bourrin que soi

    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.

  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 19
    Points : 14
    Points
    14
    Par défaut
    Oui

    Mais en fait le probleme semble s'eclaircir, j'ai obtenu des informations complementaires :
    Citation Envoyé par Eric
    Il se peut que l'implantation avec les ThreadMXBean ne fonctionne pas bien avec certaines distributions de Linux. Pendant un bon bout de temps, si je mesurais le temps CPU pour plusieurs threads, j'avais exactement le même temps par thread. Le ThreadMXBean donnait en fait le temps CPU global, bien que ce ne soit pas le contrat spécifié par l'interface.
    Cela semble un problème avec le noyau de Linux et/ou la JVM! Mais sous Windows, ça fonctionne.
    Mon programme fonctionne sous Fedora Core 6 noyau 2.6.20 avec Java 6 update 1, et sous windows XP avec Java 1.5.0_09. En revanche ne fonctionne pas sous Fedora Core 4 noyau 2.6.17 avec java 1.5.0_04.

  8. #8
    Membre averti Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Points : 306
    Points
    306
    Par défaut
    Mouais, j'en doute.... A mons avis le problème n'est pas là, mais alors je n'ai aucun idée d'où il peut venir. Désolé...
    On a toujours besoin d'un plus bourrin que soi

    Oui il y a quelques bugs dans ma librairie de Sécurité, mais les classes postées ne sont pas celles de la dernière version, et j'ai la flemme de tout modifier. Je vous donnerai avec plaisir la dernière version du jar par mp.

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

Discussions similaires

  1. Database CPU Time Ratio
    Par Oratorio dans le forum Oracle
    Réponses: 4
    Dernier message: 18/12/2012, 21h42
  2. DB time vs CPU time vs Elapsed time vs Waits
    Par zidane2012 dans le forum Oracle
    Réponses: 3
    Dernier message: 11/12/2012, 07h31
  3. Avoir l'utilisation de CPU de chaque Thread en RunTime ?
    Par reacen dans le forum Général Java
    Réponses: 4
    Dernier message: 26/07/2011, 16h25
  4. statspack: cpu time et elapsed
    Par mongolic dans le forum Administration
    Réponses: 5
    Dernier message: 21/09/2009, 18h20
  5. [ASE12.5.4] cpu time et elapsed time
    Par ngaya dans le forum Sybase
    Réponses: 3
    Dernier message: 10/05/2007, 14h18

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