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 :

a pb sans solution


Sujet :

Java

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 13
    Points
    13
    Par défaut a pb sans solution
    bonjour,
    j'ai un pb trés simple mais me donne des résultats illogique , j'ai besoin une personne qui me dit pourquoi le tempsm dans ce code me donne des résulats nulls et des fois négatifs:
    le code est le suivants:
    try {int nbr=5;
    do{
    t1=System.currentTimeMillis();//System.out.println("t1:"+t1);
    for ( int i=0; i<nbr;i++)
    sleep(3000);

    t2=System.currentTimeMillis();System.out.println("t2:"+t2);

    temps=t2-t1-3000*nbr;
    tempsm=temps/nbr;

    System.out.println("load="+tempsm);

    }while ( true);}catch(InterruptedException e) {};
    j'attends votre réponses.
    @+

  2. #2
    Membre averti Avatar de dazz_x
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2006
    Messages : 269
    Points : 328
    Points
    328
    Par défaut
    et bien des résultats nuls (ou très proche de 0) je trouverais ça plutôt normal parce que t2-t1 est égal au temps d'execution de nbr boucles de 3000ms d'attente et si par résultats "négatifs" tu entends des résultats du genre : -1.1236548943416436e-15, et bien bienvenue dans le monde du calcul flottant, parce qu'effectivement si les résultats sont trop proches de 0, il peut y avoir ce genre de comportement. Mais bon, 10e-15, c'est quand même très proche de 0.

    Si tout ce que je dis est complètement à côté de la plaque, merci de bien vouloir envoyer les lettres d'insultes sous pli discret.

    Salutations

  3. #3
    Membre actif Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 239
    Points
    239
    Par défaut
    Salut,

    Je rajouterai que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.currentTimeMillis()
    est une méthode dépendante de la plate-forme et donc elle n'est pas forcément précise à la milliseconde près. Sous certain OSla précision peut être de l'ordre de la dizaine de millisecondes(C'est écrit dans la javadoc). D'ou les résultats que tu rencontres.

    A+

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Avec ta multiplication, ne se pourrait il pas que tu explose la limite des long (ou int) car au delà d'une certaines valeur tu passe en négatif...

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 13
    Points
    13
    Par défaut
    dazz_xx: ce code calcule le moyen de temps d'attente d'un thread dans la file d'attente des processus pret dans la JVM,alors ce thread fait un sommeil puis revient à la file d'attente et attend un temp pour faire un autre sommeil, le moyen de ce temps c'est le temps d'attente que je cherchea cet effet t2.t1<> nbr*(temps de sommeil).
    t1 et t2 sont de type long .

    hydraland : je travaille sous windows et System.currentTimeMillis() en miliseconde.
    sinok : n ya pas d'explmosion car lorsque j'affiche 3000*nbr il me donne des bons résultats mais parfois sont supèrieur à t2-t1.
    et merci pour enrichir cette discussion.

  6. #6
    Membre actif Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 239
    Points
    239
    Par défaut
    Elalia,

    Dans ton code t2 - t1 = nbr*3000 + temps mise à jour du for.
    Donc la valeur de temps est toujours proche de zéro, puisque le temps de mise à jour du for est négligeable.
    Comme je t'ai indiqué la méthode System.currentTimeMillis() n'a pas forcément une précision de l'ordre
    de la milliseconde (même sous windows) ce qui veut dire que si on considère que ta boucle for prend T millisecondes alors
    t2-t1 = T +/- (2*précision de la méthode System.currentTimeMillis()).

    Sinon peux tu être plus clair sur ton besoin (en bon français s'il te plait ), car je n'ai pas compris ce que tu voulais faire.

    A+

  7. #7
    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 hydraland
    Comme je t'ai indiqué la méthode System.currentTimeMillis() n'a pas forcément une précision de l'ordre
    de la milliseconde (même sous windows)
    En effet : sous Windows la précision est généralement de l'ordre de 16 ms environ...

    Citation Envoyé par hydraland
    Sinon peux tu être plus clair sur ton besoin (en bon français s'il te plait ), car je n'ai pas compris ce que tu voulais faire.
    +1 : je n'ai pas vraiment compris l'intérêt de tout cela...

    a++

    PS : et penses aux balises [code] pour la prochaine fois

  8. #8
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 13
    Points
    13
    Par défaut
    hydraland :je ne suis pas fransaise, mais j'essaie comme meme d'expliquer mon pb en français.
    ce que tu n'as pas fait attention,c que lorsque le thread fait un sleep il libère le processeur aux autres threads ( soit de JVM ou de systeme d'exploitation ou des autres pgms ), et quand il termine sa pèriode de sommeil il attend son tour pour aquérir le processeur,c.à.d t2-t1 n'égale pas forcément au tempsde sommeil*nbre d'itérations.maist2-t1=(tempsde sommeil+temps d'attente)*nbre d'itérations.
    j'espere que tu as compris la philosophie de cet algo et mon français aussi
    @+

  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
    elalia : Je pense que le manque de précision de currentTimeMillis() est à l'origine de cette erreur. Je ne pense pas que tu puisses y faire quelque chose...

    a++

  10. #10
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 13
    Points
    13
    Par défaut
    MR Modérateur
    mais j'ai pas compris ce que veut dire une précision de 16MS peut tu me diriger vers un lien pour mieux comprendre le pb de précision , peut etre je trouve un moyen d'ajustement.et merci pour votre contribution.

  11. #11
    Membre actif Avatar de hydraland
    Profil pro
    Développeur Java
    Inscrit en
    Mai 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2006
    Messages : 179
    Points : 239
    Points
    239
    Par défaut
    elalia,
    Je comprend mieux . Dans ce cas, si tu peux passer a Java 5, utilise la méthode nanoTime() qui est plus précise. Par contre
    ton temps d'attente contiendra toujours le temps de mise à jour du for.

    A+

  12. #12
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 13
    Points
    13
    Par défaut
    neuromencien
    il ya 1 seule instruction dans la boucle for : sleep(3000);
    et quand il sort de la boucle il calcule le temps d'attente : temps
    merci comme meme.

  13. #13
    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
    Citation Envoyé par elalia
    mais j'ai pas compris ce que veut dire une précision de 16MS peut tu me diriger vers un lien pour mieux comprendre le pb de précision
    Cela signifie juste que la valzeur retourné par currentTimeMillis() est mises à jours environ toutes les 16ms seulement... Donc pendant 16ms il te reverra la même valeur.

    Ce bout de code le montre très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            for (int i=0; i<50000; i++) {
                System.out.println( System.currentTimeMillis() );
            }
    a++

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 156
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par elalia
    neuromencien
    il ya 1 seule instruction dans la boucle for : sleep(3000);
    et quand il sort de la boucle il calcule le temps d'attente : temps
    merci comme meme.
    Lol Oui je m'en suis apercu. J'en ai profité pour effacer mes bêtises mais pas assez vite

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Points : 68
    Points
    68
    Par défaut
    j'ai un message ici je ne sait pas pourquoi !

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Points : 68
    Points
    68
    Par défaut
    pourquoi un temps si long ?
    pourquoi si peu de boucle ?
    à quoi te sert ton while true à la fin ?

    j'ai un peu modifié le résultat mais j'obtient ça :
    temps=2703 pour 1000 boucles de 50ms =>2

  17. #17
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 13
    Points
    13
    Par défaut
    temps est long c logique puisque timemillis me donne une valeur de type long.
    while et true : pour calculer le temps moyen d'une manière continue .
    nombre d'itérations et le temps de sommeil :sont des paramétres q'on peut les changer .
    @+

  18. #18
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 13
    Points
    13
    Par défaut
    Modérateur : est ce que je peux mettre
    t1=System.currentTimeMillis() *16;
    t2= t1=System.currentTimeMillis()*16;
    je m'excuse je te casse la tete un peu.

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Points : 68
    Points
    68
    Par défaut
    - la question est pourquoi 3000 ms plutot que 100 ?

    - ton while true, tu rentrera dedans seulement quand tu sortira de ta boucle for, tu t'arrête jamais ?

    - ça sert à quoi tout ça au juste ?

    à première vue ça donne des fluctuations assez important :

    temps=94 pour 100 boucles de 50ms =>0
    temps=109 pour 100 boucles de 50ms =>1
    temps=234 pour 100 boucles de 50ms =>2
    temps=94 pour 100 boucles de 50ms =>0
    temps=219 pour 100 boucles de 50ms =>2
    temps=172 pour 100 boucles de 50ms =>1
    temps=109 pour 100 boucles de 50ms =>1
    temps=110 pour 100 boucles de 50ms =>1
    temps=109 pour 100 boucles de 50ms =>1

  20. #20
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 13
    Points
    13
    Par défaut
    XSEB74
    temps de sommeil=3000ms ---> le temps de sommeil doit etre +> au temps allouer par le SE à la JVM pour assuerer que le thread attend un certain temps pour aqérir le processeur.
    boucle infinie --------> pour calculer le temps d'attente de la station d'une maniere continue sans arret
    Et tout ça pour l'intégrer dans un autre pgm.
    @+

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Cas d'etudes avec ou sans solution
    Par casawi dans le forum Débuter
    Réponses: 1
    Dernier message: 12/04/2009, 12h40
  2. WARNING sans solution
    Par jena dans le forum MATLAB
    Réponses: 1
    Dernier message: 05/11/2008, 14h48
  3. 16 erreurs sans solutions
    Par neon29 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 26/09/2008, 19h08
  4. Réponses: 2
    Dernier message: 22/06/2008, 10h05
  5. Ecriture Fat32 : pistes sans solution :-(
    Par tynmar dans le forum Administration système
    Réponses: 9
    Dernier message: 02/05/2006, 15h50

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