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

Langage Java Discussion :

temps d'execution sui augmente.


Sujet :

Langage Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Par défaut temps d'execution sui augmente.
    bonjour,
    Je suis débutant en java. J'aimerai vous soumettre un problème que j'ai. Je ne pense pas qu'il s'agisse d'un problème algorithmique mais bien un problème inhérent au langage JAVA.
    voici l'histoire.

    j'ai réalisé un programme qui sera amené a fonctionné sur un grand nombre de données de la façon suivante:

    1) lecture d'un fichier
    2) analyse du fichier
    3) traitement

    Lors de ces trois phases, j'instancie un grand nombres d'objets.

    l'exécution de ce programme prend environ 4.5 secondes lorsque je l'exécute sur un fichier.

    J'ai ensuite essayé d'insérer une boucle for dans le main pour faire une moyenne du temps d'exécution :

    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
    public static void main(String[] args) {
    		//un parseur de fichier
    		CustomFileReader fic = null;
    		//une structure de donnée pour stocker l'info
    		HashMap<String, Double> infos=null;
     
    		for (int i = 0 ; i < 4; i ++ ){
     
    			long debut =System.nanoTime()/1000000000;
    			long fin =0;
     
    			System.out.println( "debut : "+debut ) ;
     
    			fic = null;
    			infos = null;
    			1) lecture du fichier
    		        	2) analyse du fichier
                           		3) traitement
     
     
     
     
    			System.gc();
    			fin = System.nanoTime()/1000000000;
    			System.out.println( "fin : "+fin  ) ;
    			System.out.println( "diff : "+(fin-debut)  ) ;
    		}
    		System.exit(0);
     
    	}

    voici ce que le programme genere comme sortie :
    Code X : 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
    debut : 1162548161
    
    fin : 1162548166
    diff : 5
    debut : 1162548166
    
    fin : 1162548183
    diff : 17
    debut : 1162548183
    
    fin : 1162548219
    diff : 36
    debut : 1162548219
    
    fin : 1162548282
    diff : 63


    diff correspond au temps d'exécution d'une boucle. On voit bien que le temps d'exécution crois très vite alors qu'il s'agit du même traitement exécuté 4 fois sur le même fichier

    D'autre part, j'ai essayé par un script perl de lancer le programme sans la boucle for :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/usr/bin/perl
     
    for($i = 0 ; $i <4 ; $i++){
           System("time java - jar test.jar");
    }
    je constate alors que le temps d'exécution reste constant...

    Comment cela ce fait il que le temps d'exécution augmente dans un cas et pas dans l'autre?????
    Quelqu'un aurai-t-il une idée
    Je vais être amené a traiter un grand nombre d'information et je ne souhaiterai pas avoir a utiliser un artifice tel que "lancer le programme avec un script perl"
    Si quelqu'un pourrai me donner une piste cela m'aiderai beaucoup.

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    tu évites au maximum les déclarations et allocations à l intérieur de ta boucle, tu réutilises au maximum tes variables, et tu sors le plus de traitement possible de ta boucle.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Par défaut
    oui c'est ce que je fais:

    tous mes objet sont déclaré en dehors des boucles et sont instancier a l'interieur (pas le choix)
    en gros avant chaque boucle, je fais:
    object toto = null;
    dans la boucle:
    toto = new object();
    fain de la boucle

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 42
    Par défaut
    A noter que tu utilises system.gc.... ce n'est vraiment pas recommandé...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Par défaut
    j'ai essaye avec sans system.gc() rien ne change....

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 42
    Par défaut
    D'ou l'inutilité de l'appeler... le garbage collector est géré par java il n'est pas conseillé de l'appeler a tout va..... c'était juste une remarque...
    Sinon remet tu bien toutes tes variables instanciés à null à la fin de ton execution (afin justement qu'elles soient nettoyées)...??

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Par défaut
    oui a chaque debut de la boucle for, tous mes objets sont réinitialisé a null

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 42
    Par défaut
    ce qui fait que ton prog met a null un objet qu'il connait deja... moi je demande en fin d'execution... jsuis pas si sur que ca que ca change beaucoup de chose... il faudrait que tu nous fasses voir plus en détail le code.....

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Par défaut
    je viens d'essayé de mettre a nulle en fin de boucle et non en début: cela ne chage rien
    je ve bien donner plus de détails sur mon code, mais il est déja assé complex et je pense pas que cela vous aiderai.
    Vu que le temps double a chaque iteration...
    Je pencherai plutot pour une solution inverse: declarer tous mes objets dans les boucles pour etre sur que la MV java les désalous bien en fin de parcourt...

  10. #10
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 819
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 819
    Par défaut
    Salut,

    En testant ton code, en remplaçant ton traitement de fichier par une boucle "for" vide (j'ai aussi remplacé le "CustomFileReader"...), on tombe sur des durées similaires... donc ça doit venir de ton traitement de fichier...

    Essaye cette manipulation de ton côté (tu enlèves les points 1-2-3 du code que tu nous a donné, tu remplaces par une boucle "for" vide suffisamment longue pour avoir des durées), dis-nous ce que tu obtiens.
    Si tu as des écarts similaires, il faudra sans doute se pencher sur ton traitement du fichier... il doit y avoir un truc litigieux qui traine...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Par défaut
    merci je vais tester ca de suite

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Par défaut
    Citation Envoyé par plegat
    Salut,

    En testant ton code, en remplaçant ton traitement de fichier par une boucle "for" vide (j'ai aussi remplacé le "CustomFileReader"...), on tombe sur des durées similaires... donc ça doit venir de ton traitement de fichier...

    Essaye cette manipulation de ton côté (tu enlèves les points 1-2-3 du code que tu nous a donné, tu remplaces par une boucle "for" vide suffisamment longue pour avoir des durées), dis-nous ce que tu obtiens.
    Si tu as des écarts similaires, il faudra sans doute se pencher sur ton traitement du fichier... il doit y avoir un truc litigieux qui traine...
    bon me revoila
    alors g essayé de relancer le teste en mettant
    létape 1
    puis les étapes 1 et 2
    puis 1, 2 et 3.
    visiblemant, c qd je rajoute l'étape 3 que le temps augmente.
    je vais creuser de ce coté mais je ne comprend toujours pas pourquoi lorsque je met a null tous mes objet cela ne suffit pas.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Par défaut la soluce enfin
    voila l'histoire
    c une grosse boulette de ma pare:
    j'ai crée une liste statique membre de classe. A chaque création d'un objet de cette classe, j'ajoute des données dans cette liste. Du coup les données restaient stockées en membre de classe et quand je parcoure ces données, la taille augmentais.

    voila
    moralité bien faire gaffe aux objets statiques....
    heureusement que j'ai commencé par dire que j'étais un débutant
    merci a tous

  14. #14
    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
    Par défaut
    Citation Envoyé par weill nathanal
    oui a chaque debut de la boucle for, tous mes objets sont réinitialisé a null
    Ca sert à rien de mettre les variables à null, que ça soit au début ou à la fin de la boucle...
    Au début, car de toute façon tes variables vont référencer un nouvel objet par la suite (sans doute par un new), donc l'ancien n'est plus lié, pas besoin de passer par un état intermédiaire "null".
    À la fin, car de toute façon tu sors d'un bloc ( { } ) (en l'occurence, for), et donc tes variables n'existent plus après chaque tour de boucle...

    Enfin, c'est juste parce que ça fait je ne sais pas combien de fois que je lis qu'il faut remettre à null des variables avant de quitter une fonction ou une boucle, alors que c'est inutile... (fin de bloc => variables locales disparues)

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 13
    Par défaut
    oui c'est bien ce qui me semblais avoir lu dans la doc java
    mais bon au début on commence toujours par remettre en cause la jvm et finalement il s'agit que d'une boulette de la part de programmeur...

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 42
    Par défaut
    Ca lui aurait quand meme éviter pour sa variable static... d'avoir ce souci... mieux vaut prévenir que guérir....m'enfin c'est vrai que pour des variables locales c'est pas utile...

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

Discussions similaires

  1. limit et temps d'execution avec oracle et PHP
    Par dor_boucle dans le forum Oracle
    Réponses: 20
    Dernier message: 10/12/2005, 14h31
  2. Temps d'execution d'un select sur une vue
    Par rosewood dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/02/2005, 16h06
  3. Temps d'execution d'une requête
    Par Maglight dans le forum Bases de données
    Réponses: 3
    Dernier message: 27/01/2005, 08h38
  4. [VB.NET] Temps d'éxécution d'une page...
    Par Webman dans le forum ASP.NET
    Réponses: 3
    Dernier message: 04/06/2004, 12h20
  5. Connaitre le temps d'execution d'un pgm ?
    Par yacinechaouche dans le forum C
    Réponses: 7
    Dernier message: 27/01/2003, 20h57

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