Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1551 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Optimisation d'un code en java (JTextArea>codage>JTextArea)

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Optimisation d'un code en java (JTextArea>codage>JTextArea)

n°519122
sdk
Posté le 20-09-2003 à 20:28:47  profilanswer
 

Voila j'ai un JTextArea remplit d'un certain text, il faut que je balaye le JTextArea char par char et remplacer les char par une autre chaine et écrire cette nouvelle chaine dans un autre JTextArea. je fait le tout dans un Thread pour pouvoir moniter l'avancement sur un JProgressBar
 
J'ai testé deux méthodes, je li le char, je cherche le correspondant et je le append dans le JTextArea resultat > ca plante et ca ram :/, deuxieme méthode je cré une String énorme et je fait un setText a la fin > c'est lent mais ca plante plus
 
je cherche a optimisé merci de donner vos avis  :hello:  
 
 
 
voici en gros ce que je fait pour l'instant :
 

Code :
  1. StringReader st = new StringReader(jta_docDepart.getText());
  2.   jta_docCode.setText("" );
  3.   int c;
  4.   String enorme = "";
  5.   c = st.read();
  6.   while(c>=0) {
  7.    enorme = enorme.concat(renvoie_chaine((char)c));
  8.    c = st.read();
  9.    codage++;
  10.   }
  11.   jta_docCode.setText(enorme);
  12.  }


Message édité par sdk le 20-09-2003 à 20:29:21
mood
Publicité
Posté le 20-09-2003 à 20:28:47  profilanswer
 

n°519123
Taz
bisounours-codeur
Posté le 20-09-2003 à 20:31:50  profilanswer
 

StringBuffer

n°519126
sdk
Posté le 20-09-2003 à 20:38:00  profilanswer
 

Taz a écrit :

StringBuffer


 
effectivement j'aurai du y penser plus tot :/ merci ;)
 
mais now le pb c'est pour afficher un Stringbuffer dans un JTextArea, si je fait un toString setText ca revient au meme :/

n°519128
Taz
bisounours-codeur
Posté le 20-09-2003 à 20:39:07  profilanswer
 

:heink: concrètement tu fais quoi?

n°519129
sdk
Posté le 20-09-2003 à 20:41:07  profilanswer
 

Taz a écrit :

:heink: concrètement tu fais quoi?


 
Je code un text en binaire, c'est a dire j'ai ma table de convertion je prend un "a" et je le transforme en "001" (par exemple) et le truc c'est que ca doit etre graphique, donc on doit voir dans un JTextArea une suite de 1 et de 0 correspondant au codage du text d'un autre JTextArea, donc ca fait bcp de  1 et de 0 a afficher :) je cherche donc un moyen maintenant d'afficher mon StringBuffer sans tout faire ramer ...

n°519131
Taz
bisounours-codeur
Posté le 20-09-2003 à 20:42:24  profilanswer
 

aucun, faut repasser par la casse String

n°519135
sdk
Posté le 20-09-2003 à 20:45:20  profilanswer
 

Taz a écrit :

aucun, faut repasser par la casse String


 
 :cry:  :cry:  :cry:  
 
 
faut que je trouve le moyen de d'afficher bcp de 0 et de 1 dans un composant sans tout faire ramaÿ  :sweat:  
 
tu penses vraiment qu'il ya pas de solution ?
 
paske le .setText(stringbuffer.toString()) c'est bof :/

n°519137
Taz
bisounours-codeur
Posté le 20-09-2003 à 20:47:39  profilanswer
 

ça rame à ce point ? quel volume le texte source ?
 
 
edit : tu ferais peut etre bien de tout lire d'un coup, créer le StringBuffer avec la bonne taille initiale d'une part, et pour ta fonction char -> binaire, tu peux soit l'améliorer (avec un String bin[256] pour pas faire 8 tests à chaque fois) ou bien l'inliner à la main pour voir. sinon, je vois rien d'autre : si tu dois traduire tout un texte en un autre, c'est la seule manière il me semble


Message édité par Taz le 20-09-2003 à 21:05:38
n°519315
benou
Posté le 21-09-2003 à 01:11:50  profilanswer
 

déjà, utiliser StringBuffer.append() à la place de Strign.concat() ca te fera bcp gagner.
 
ensuite l'autre idée, si tu veux éviter de créer des String inutiles c'est que plutot que ta chaine de codage retourne une String, elle ajoute la chaine à retourner dans un StringBuffer. ex :
String enorme = "";
enorme = enorme.concat(renvoie_chaine((char)c));

devient
StringBuffer enorme = new StringBuffer();
ajoute_chaine((char) c, enorme);

 
à suivre l'arrivée d'un prochain SringBuilder en jdk1.5 (un StringBuffer non synchronizé d'après ce que j'ai compris)


Message édité par benou le 21-09-2003 à 01:12:14

---------------
ma vie, mon oeuvre - HomePlayer
n°519338
the real m​oins moins
Posté le 21-09-2003 à 02:41:20  profilanswer
 

euh sur un StringBuffer tu peux faire append(char c) hein ...
 
et pour StringBuilder, j'ai envie de resortir le lien qui explique le fait que la synchronization diminue les perfs est une legende urbaine :D


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
mood
Publicité
Posté le 21-09-2003 à 02:41:20  profilanswer
 

n°519378
sdk
Posté le 21-09-2003 à 10:17:46  profilanswer
 

Taz a écrit :

ça rame à ce point ? quel volume le texte source ?
 
 
edit : tu ferais peut etre bien de tout lire d'un coup, créer le StringBuffer avec la bonne taille initiale d'une part, et pour ta fonction char -> binaire, tu peux soit l'améliorer (avec un String bin[256] pour pas faire 8 tests à chaque fois) ou bien l'inliner à la main pour voir. sinon, je vois rien d'autre : si tu dois traduire tout un texte en un autre, c'est la seule manière il me semble  


 
ben en fait ca rame pas au niveau du calcul et de la création du StringBuffer, ca ca marche tres bien, mais quand je veu l'afficher en repassant par un String j'ai un beau "java.lang.OutOfMemoryError" :/, sur un test d'uun fichier d'un mo.
 
j'ai pas bien comprit ton histoire de String bin[256]  :(

n°519379
sdk
Posté le 21-09-2003 à 10:18:42  profilanswer
 

benou a écrit :

déjà, utiliser StringBuffer.append() à la place de Strign.concat() ca te fera bcp gagner.
 
ensuite l'autre idée, si tu veux éviter de créer des String inutiles c'est que plutot que ta chaine de codage retourne une String, elle ajoute la chaine à retourner dans un StringBuffer. ex :
String enorme = "";
enorme = enorme.concat(renvoie_chaine((char)c));

devient
StringBuffer enorme = new StringBuffer();
ajoute_chaine((char) c, enorme);

 
à suivre l'arrivée d'un prochain SringBuilder en jdk1.5 (un StringBuffer non synchronizé d'après ce que j'ai compris)


 
oui avec le stringbuffer ca marche tres bien, j'append a chaque passage et c'est tres rapide, maintenant le probleme se pose pour l'affichage :/ car je doit repasser par un string et donc on revient au pb de départ :/

n°519388
Taz
bisounours-codeur
Posté le 21-09-2003 à 10:32:20  profilanswer
 

Sdk a écrit :


 
ben en fait ca rame pas au niveau du calcul et de la création du StringBuffer, ca ca marche tres bien, mais quand je veu l'afficher en repassant par un String j'ai un beau "java.lang.OutOfMemoryError" :/, sur un test d'uun fichier d'un mo.


 
c'est que tu fais péter la limite des 64Mo si je ne m'abuse
essaye
-Xmx96m
 
tu ferais bien de profiler tout ça quand même pour être sur de savoir ou sont les problèmes. elle fais quelle taille ta String finale ? moi je te conseille de tout lire d'un coup déjà, à savoir n char, ensuite new StringBuffer(n), remplissage [appel au gc], toString
 

Sdk a écrit :


j'ai pas bien comprit ton histoire de String bin[256]  :(  


 
ben
 
String bin[256]={
 "00000000"
 "00000001"
 ....
 "11111111"}
 
passe en hexa  :sol:

n°519407
sdk
Posté le 21-09-2003 à 10:58:35  profilanswer
 

Taz a écrit :


 
c'est que tu fais péter la limite des 64Mo si je ne m'abuse
essaye
-Xmx96m
 
tu ferais bien de profiler tout ça quand même pour être sur de savoir ou sont les problèmes. elle fais quelle taille ta String finale ? moi je te conseille de tout lire d'un coup déjà, à savoir n char, ensuite new StringBuffer(n), remplissage [appel au gc], toString
 
ben
 
String bin[256]={
 "00000000"
 "00000001"
 ....
 "11111111"}
 
passe en hexa  :sol:  


 
je comprend pas tout  :pt1cable: , bref le principe de base c'est de simuler la compression d'un fichier text, c'est a dire ouvrir le fichier dans un jtextarea, ensuite calculer le code correspondant a chaque char ( les trucs de bases de compressions, on calcul les effectifs ) donc en fait mon code obtenu est un code a longeur variable, et il est préfix pour que je puisse décoder.
 
le principe c'est donc ouvrir un fichier(jtextarea) > trouver le code > afficher le fichier codé en binaire (jtextarea) > décoder > afficher le text identique a l'original.
 
le probleme vient bien quand je fait le tostring de mon sb, car j'ai un jprogressbar qui monitore, et en fait a 100% ca commence a ramer... et out of mémory, sur des petits fichiers ca marche tres bien, mais des que le fichier est un peu gros, le calul du sb marche toujours bien mais au toString ca merde :/
 
 
edit : un screenshot pr mieu visualiser : http://membres.lycos.fr/pok3s/jcode.jpg


Message édité par sdk le 21-09-2003 à 11:02:58
n°519408
benou
Posté le 21-09-2003 à 10:58:42  profilanswer
 

Sdk a écrit :


oui avec le stringbuffer ca marche tres bien, j'append a chaque passage et c'est tres rapide, maintenant le probleme se pose pour l'affichage :/ car je doit repasser par un string et donc on revient au pb de départ :/


mais non le problème est pas le même !!!!
Une fois que ton StringBuffer est rempli, tu le passes en String et c'est bon.
 
Le problème avec ton ancienne manip c'est qu'à chaque fois que tu faisait un concat,  ca créé une nouvelle String => si ta boucle c'était sur un fihcier d'1Mi, tu crées une String de ., 6, 9, 12, ..., 2 999 997, 3 000 000 octet. Bref, tu faisais exploser la mémoire : ton prog consommais 4,5 Téra octets de mémoire !!!! tu métonnes qu'il faisait un OutofMemory ! :/
 
Le truc à faire : créer un StringBuffer de la bonne taille (tu peux l'estimer sir tu connais la taille du fichier). Ca évitera les copies inutiles pour l'agrandir. A la fin tu auras un StringBufferqui prendra environ 3Mo. tu fais un toString pour le récupérer sous forme de String => ca créé un 2e objet de 3Mo. C'est gourmand en rame mais on reste dans les limites du raisonable.
 
Par contre, quand tu vas voiloir afficher ca (le mettre dans ton JTextField), Swing y risque de pas être content : afficher 6 millions de caractère, il risque d'avoir du mal à digérer :/
 
Mais bon, c'est pas le passage du StringBuffer à String qui va poser problème


---------------
ma vie, mon oeuvre - HomePlayer
n°519413
Taz
bisounours-codeur
Posté le 21-09-2003 à 11:02:44  profilanswer
 

cela dit pour ta compression en elle meme, j'espere que tu travailles pas avec des char mais bien avec des byte et des opéations binaires

n°519414
benou
Posté le 21-09-2003 à 11:04:24  profilanswer
 

the real moins moins a écrit :

euh sur un StringBuffer tu peux faire append(char c) hein ...


sans blague :o
 
mais ca évite de créer des chaines inutiles de directement l'ajouter au StringBuffer
 

the real moins moins a écrit :


et pour StringBuilder, j'ai envie de resortir le lien qui explique le fait que la synchronization diminue les perfs est une legende urbaine :D


 
ben tiens ... et la gestion des sections critiques, etc ... faut bien qu'elle les execute quand même la JVM :o
Dire que c'est pas aussi gourmand que la "légende" le raconte OK, mais y a forcément un coût [:spamafote]
 
Dans le cas d'utilisation poussée du StringBuffer en monothreadé, ils prévoient une amélioration de 20% des perfs avec le StringBuilder ...


---------------
ma vie, mon oeuvre - HomePlayer
n°519415
benou
Posté le 21-09-2003 à 11:04:47  profilanswer
 

Taz a écrit :

cela dit pour ta compression en elle meme, j'espere que tu travailles pas avec des char mais bien avec des byte et des opéations binaires


méga +1  [:wam]


---------------
ma vie, mon oeuvre - HomePlayer
n°519419
sdk
Posté le 21-09-2003 à 11:10:07  profilanswer
 

Taz a écrit :

cela dit pour ta compression en elle meme, j'espere que tu travailles pas avec des char mais bien avec des byte et des opéations binaires


 
bah j'essaie mais pour opéations binaires j'ai du mal :/
 
edit : on gagne vraiment ?


Message édité par sdk le 21-09-2003 à 11:10:39
n°519422
benou
Posté le 21-09-2003 à 11:12:06  profilanswer
 

Sdk a écrit :


edit : on gagne vraiment ?


un ton avis ?
utiliser 1 bit à la place de 8 ca risque d'améliorer les perfs ? :/


---------------
ma vie, mon oeuvre - HomePlayer
n°519428
sdk
Posté le 21-09-2003 à 11:15:12  profilanswer
 

benou a écrit :


un ton avis ?
utiliser 1 bit à la place de 8 ca risque d'améliorer les perfs ? :/


 
effectivment   :)

n°519434
sdk
Posté le 21-09-2003 à 11:22:24  profilanswer
 

benou a écrit :


un ton avis ?
utiliser 1 bit à la place de 8 ca risque d'améliorer les perfs ? :/


 
ouais mais avec des bytes je pert de la présition pour les char spéciaux ? y me reconnai pas tout en byte

n°519435
Taz
bisounours-codeur
Posté le 21-09-2003 à 11:24:40  profilanswer
 

ben non. tes données son sous une forme données (char[], String, etc), toi tu convertis tout ça en byte et bosse dessus), ou alors lecture directe sous forme de byte

n°519437
sdk
Posté le 21-09-2003 à 11:28:45  profilanswer
 

Taz a écrit :

ben non. tes données son sous une forme données (char[], String, etc), toi tu convertis tout ça en byte et bosse dessus), ou alors lecture directe sous forme de byte


 
heu mais par exemple un 'é' jeu pas le coder avec un byte :/


Message édité par sdk le 21-09-2003 à 11:30:53
n°519438
Taz
bisounours-codeur
Posté le 21-09-2003 à 11:34:50  profilanswer
 

:heink:

n°519440
sdk
Posté le 21-09-2003 à 11:35:08  profilanswer
 


 
 :(
 
explain to me  :sweat:
 
ben je sais avec un byte je peu coder que la table ascii et ca reste limité quand meme ... ou bien j'ai vraiment rien capté  :whistle:


Message édité par sdk le 21-09-2003 à 11:48:46
n°519442
sdk
Posté le 21-09-2003 à 11:51:14  profilanswer
 


 
allé un peut de compassion  :cry:


Message édité par sdk le 21-09-2003 à 11:52:35
n°519443
Taz
bisounours-codeur
Posté le 21-09-2003 à 11:53:14  profilanswer
 

bah regarde java.lang.Byte quand même

n°519447
Taz
bisounours-codeur
Posté le 21-09-2003 à 11:57:42  profilanswer
 

sinon affiche de l'hexa et ton problème de perf va s'arranger, et ça n'en sera que plus lisible


Message édité par Taz le 21-09-2003 à 11:57:54
n°519454
sdk
Posté le 21-09-2003 à 12:09:27  profilanswer
 

Taz a écrit :

bah regarde java.lang.Byte quand même


 
j'ai regardé, et je lit un peu les trucs de codages de la doc java,
 
mais en fait vous me conseillé au lieu de travailler avec un "char" pour un caratere de travailler avec un "byte" par caracter c'est ca ?
 
j'ai bien comprit que le but est d'évité de travailler avec des char codé sur 1octet, mais je comprend pas bien comment faire :/


Message édité par sdk le 21-09-2003 à 12:10:24
n°519455
Taz
bisounours-codeur
Posté le 21-09-2003 à 12:10:34  profilanswer
 

ben les bytes, c'est fait pour représenter du binaire

n°519461
sdk
Posté le 21-09-2003 à 12:16:46  profilanswer
 

Taz a écrit :

ben les bytes, c'est fait pour représenter du binaire


 
je comprend pas bien comment coder un char dans un byte [:almar]

n°519463
Taz
bisounours-codeur
Posté le 21-09-2003 à 12:20:57  profilanswer
 

j'abandonne

n°519466
sdk
Posté le 21-09-2003 à 12:22:57  profilanswer
 

Taz a écrit :

j'abandonne


 
naaaaaaaaaan  :cry:

n°519474
sdk
Posté le 21-09-2003 à 12:38:27  profilanswer
 

hann, je viens de réveillé, croyait que vous étiez entrain de me parler pour l'affichage, rololo 30min que je me prend la tete a essayé de comprendre ce que vous voulez lol, évidement que mon fichier compressé je l'écrit en binaire, c'est pas une fichier texte avec des 0 et des 1 dedans, c'est bien ce ca ques vous aviez peur non ?, là je bosse avec des char etc car tout doit etre graphic, mais le fichier en lui meme est évidement écrit en binaire

n°519481
sdk
Posté le 21-09-2003 à 13:14:48  profilanswer
 

et donc pout mettre un gros StringBuffer avec un composant swing quelqu'un a une id ?

n°519482
the real m​oins moins
Posté le 21-09-2003 à 13:15:08  profilanswer
 

benou a écrit :


sans blague :o
 
mais ca évite de créer des chaines inutiles de directement l'ajouter au StringBuffer
 

ben oui, pourquoi tu dis "mais" !?
dans ton example de code, tu passais justement par une methode intermediaie pour ajouter le char...
 
bref...
 


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°519498
sdk
Posté le 21-09-2003 à 13:35:22  profilanswer
 

Sdk a écrit :

et donc pout mettre un gros StringBuffer avec un composant swing quelqu'un a une id ?


 
 
bref ... comment j'afficher mon gros StringBefouz  :whistle:

n°519527
benou
Posté le 21-09-2003 à 14:21:36  profilanswer
 

the real moins moins a écrit :

ben oui, pourquoi tu dis "mais" !?
dans ton example de code, tu passais justement par une methode intermediaie pour ajouter le char...


je pense que t'as pas capté : le char il le transforme en String => si tu ajoute directement les différent char de la String dans le buffer c'est plus rapide que de créer une String puis de l'ajouter dans le buffer.


---------------
ma vie, mon oeuvre - HomePlayer
n°519529
benou
Posté le 21-09-2003 à 14:22:15  profilanswer
 

Sdk a écrit :

et donc pout mettre un gros StringBuffer avec un composant swing quelqu'un a une id ?


à quoi ca va te servir d'avoir un textfield avec des millions de caractères dedans ? c'est illisble !!  
c'est quoi l'intéret d'afficher ca ?


---------------
ma vie, mon oeuvre - HomePlayer
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Optimisation d'un code en java (JTextArea>codage>JTextArea)

 

Sujets relatifs
Débat ouvert sur les techniques de codage[java] printf
[java]resolution impression[Java] delegation pattern
Interaction avec mon prog javaImprimer ou copier/coller du code avec les COULEURS
[linux] commication avec une appli java depuis le kernel[résolu]Problème de compatibilité IE sur un bout de code
[java]erreur lors de compilation sous Visual Studio.netVBS - Un p'tit code pour trouver les fichiers identiques sur un DD
Plus de sujets relatifs à : Optimisation d'un code en java (JTextArea>codage>JTextArea)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR