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

AWT/Swing Java Discussion :

[HTML] Les balises ralentissent l'exécution


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 340
    Par défaut [HTML] Les balises ralentissent l'exécution
    Je me sers d'un jtextarea, dans lequel j'écris pas mal de texte à l'aide de append(). Et ensuite, je récupère le contenu du textarea et je l'ajoute sur un flux de sortie PrintWriter vers un fichier txt.
    Jusqu'à présent, j'écrivais normalement (avec des \n), et tout marchait bien, sauf que quand j'ouvrais le fichier txt, les 500 ou 600 lignes étaient pénibles à lire.
    Alors j'ai voulu essayer d'écrire sur mon flux texte avec du code html, et en sortant vers un fichier html.
    J'ai donc rajouté en début et fin de texte les balises <html> et </html>, et ça marche bien, j'ai un affichage satisfaisant, avec des couleurs,...

    Le problème, c'est que depuis que j'ai fait ça, mon exécution est très lente. Après 1 heure à débugger, j'ai identifié le lieu du problème. Dans mon programme, je créé une grille, je la remplis d'amibes ou de nourriture. Ensuite, une fois la grille créée, je parcours chaque case une à une, et selon ce qu'elle contient, j'appelle une méthode pour afficher les caractéristiques de l'amibe ou de la nourriture présente.

    Voici le code :
    ici, la boucle de parcours des cases
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for(int i=0;i<Grille.largeur;i++){
    	for(int j=0;j<Grille.largeur;j++){
    		if(grille.grille[i][j].contientAmibe) 
    			log.append(grille.afficherCaractAmibe(grille.grille[i][j].a));
    		else if(grille.grille[i][j].contientNour)
    				log.append(grille.afficherCaractNourriture(grille.grille[i][j].nourriture));
     
    	}
    }
    ici, la méthode pour afficher les caractéristiques de l'amibe
    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
     
    public String afficherCaractAmibe(Amibe am){
        	String s="";
    		String sexe="";
        	if(am!=null){
    		if(am.getSexe()==0) sexe+="mâle";
    		else sexe+="femelle";
    		int a=am.numCaseCourante/Grille.largeur;
    		int b=am.numCaseCourante%Grille.largeur;
    		s+="\nUne amibe a été placée sur la case à la ligne n°"+a+" et la colonne n°"+b+".";
    		s+="\nSes caracteristiques sont :"+
    			"\n- sexe : "+sexe+
    			"\n- age : "+am.getAge()+
    			"\n- ageMax : "+am.getAgeMax()+
    			"\n- energie : "+am.getEnergie()+
    			"\n- pince : "+am.getPince()+
    			"\n- venin : "+am.getVenin()+
    			"\n- machoire : "+am.getMachoire()+
    			"\n- carapace : "+am.getCarapace()+
    			"\n- epine : "+am.getEpine()+
    			"\n- antivenin : "+am.getAntiVenin();
    		s+="\n";
    		return s;
    	}
    	else {
    		s="\nIl n'y a pas d'amibe à cet emplacement";
    		return s;
    	}
    }
    ici, la méthode pour afficher les caractéristiques de la nourriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public String afficherCaractNourriture(Nourriture n){
    	String s="";
    	int a=n.numCaseCourante/Grille.largeur;
    	int b=n.numCaseCourante%Grille.largeur;
    	s+="\n"+n.getNourriture()+" unités de nourriture ont été placées sur la case à la ligne n°"+a+" et la colonne n°"+b+".";
    	s+="\n";
    	return s;
    }
    J'ai fait un test, pour mesurer le temps qui s'écoule entre le clic sur OK et l'affichage de la grille (puisque c'est cette étape qui prenait un temps fou depuis les modif)
    - en ayant remplacé les 15 \n par des <br> de afficherCaractAmibe, j'ai enregistré, relancé l'exécution. entre le clic sur ok et l'affichage, j'ai mesuré env 1,3s
    - en reprenant la méthode afficherCaractAmibe modifiée et en remplaçant les 2 \n par des <br>, là, je mesure 22,7 secondes !!

    Que se passe t il? Est ce un pb de surchage mémoire? est ce le html qui pose problème ?

    NB : je précise que je n'ai pas besoin de voir le texte stocké dans le textarea (de toute façon, avec les balises html, il est illisible), celui ci ne me sers qu'à stocker le texte en attendant d'être copié sur le flux texte

  2. #2
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Bonjour,

    il est possible que si le texte est long, le parsage du code html puisse prendre du temps. Le seul conseil que je vois, c'est d'éviter d'assigner le texte au JTextArea si il n'est pas affiché. Ca évitera de déclencher un parsage.

    Tant qu'on est sur des problèmes de performances, je te conseille fortement d'utiliser un StringBuilder (ou StringBuffer en 1.4) pour la concaténation au lieu d'additionner des Strings. Et pour la liste, il y a la balise <ul>.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Par défaut
    pourquoi le mettre dans un JTextArea si tu n'a pas besoin de le lire? autant directement travailler avec des variables ou un objet.
    si tu veux l'afficher sur le programme utilise un JEditorPane qui lui est capable de lire l'html et de l'afficher sinon.

    en tout cas il doit y avoir quelque chose de pas très propre je pense parce que pour te donner un exemple parser un fichier XML de 1Mo ne prend que une ou 2 secondes normalement et c'est un peu du même ordre.

Discussions similaires

  1. supprimer toutes les balises d'un code html (regex?)
    Par le y@m's dans le forum Langage
    Réponses: 5
    Dernier message: 21/01/2014, 10h08
  2. Script pour enlever les balises html
    Par Scratch48 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 02/11/2005, 17h16
  3. [XSL] conserver les balises html
    Par krappa dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 07/07/2005, 15h14
  4. forcer xsl à interpréter les balises html
    Par canal68 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 07/07/2005, 15h02

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