Aide - Recherche - Membres - Calendrier
Version complète : [tomcat] Optimisation / Efficacité
Forum Développeur - Administration serveur, programmation et base de données > Programmation > ASP
wox-xion
Resalut à tous ! biggrin.gif Voilà, quand je redémarre tomcat, toutes les pages jsp et autres servlets / beans sont "lents" à s'exécuter... J'aimera savoir comment combler cela... J'essaie d'augmenter l'utilisation de la ram par tomcat, je suppose que plus il utilise de la mémoire, plus il est efficace, non ? (s'il l'utilise bien, bien sûr wink.gif) Le problème ne se situe qu'à un endoit en fait... sad.gif Si bien sûr vous pouviez m'aider à voir comment optimiser mon code, ça serait super ! biggrin.gif J'utilise une classe pour compiler mes textes (reçus depuis un formulaire flash). Voici le bean qui formate justement ces textes : ici (long, donc je ne poste pas le code ici, surtout que ça déformerait la page) ... Il y a deux endroits que je sais être très gourmand en temps d'exécution, donc embêtant pour moi, car ils me font perdre un temps ... fou ! Premièrement, le formattage des balises [code:x] ... [/code]. D'abord, il faut les former, ensuite créer les   à l'intérieur, puis supprimer les <br />... (désolé mais le forum interprète les retours chariots quand on les écrits normalement ^^) Ensuite, et ça rejoint mon premier problème sur le fait des <br /> : je sors les données de mon formulaire flash... donc pour pouvoir garder les retour à la ligne, j'utilise le code post_text.textHtml, donc le texte est formé de morceaux du type :
CODE
<TEXTFORMAT LEADING="2"><P ALIGN="left"><FONT FACE="arial" SIZE="12" COLOR="#000000">texte.... pas de retour dans ce block inline</FONT></P></TEXTFORMAT>
Je reforme ces blocs pour créer des éléments [start] text [br] [br] sera ensuite transformé en ... [start] permet de dire qu'un smiley est au début d'une ligne, donc n'a pas besoin d'espace devant lui pour être formatté correctement... Et à la fin, je supprime toutes les balises non-traitées... Que puis-je faire pour améliorer tout cela (je sais que je dois mal m'y prendre, quand je vois la rapidité que met le blog de liguorien pour traiter les posts...) ?
wox-xion
je suis en travail sur une nouvelle version, j'ai donc trouvé une solution...
après visu, il me suffit de travailler sur post_text.text, et je peux trouver les retours chariots tout simplement via les caractères \n (que je ne voyais tout simplement pas à l'oeil ^^ je suis bête...).

Par contre, si vous avez une idée sur comment bien faire avec les espace blancs à transformer en   je serai très heureux wink.gif
wox-xion
J'ai une question importante, qui me trouble depuis que les regex java sont dans ma vie... :?

Voilà... lorsque je veux faire une sorte de bbcode, je fais :
CODE
str = Pattern.compile("\\[i\\]([^\\[]*[^/]*[^i]*[^\\]]*)\\[/i\\]").matcher(str).replaceAll("<i>$1</i>");


Ok, ça ça marche... mais c'est pas très beau :roll:
Y a-t-il moyen de dire à la place de
QUOTE
([^\\[]*[^/]*[^i]*[^\\]]*)
quelque chose comme :
QUOTE
tout sauf le mot x

Tout sauf le terme x, c'est simple ([^x]*).
Mais tout sauf le mot xyz, je vois pas... autrement que ([^x]*[y]*[^z]*).
Surtout que ce système a une faille certaine... (pas possible le [xxxyyyyyz] ^^)

Si vous pouviez m'aider, ça serait super smile.gif
wox-xion
bon, bas j'ai déjà fait deux modifications certaines :
->gestion des smilies via deux tableaux
->gestion des balises simples via deux tableaux et remplacement via les méthodes de String non-regex comme indexOf et substring...
->gestion des acronym directs (mais c'est là que j'ai une question...)

Voilà, pour les acronymes, j'ai :
CODE
   static String[] acrstr = {"as", "asp", "atom", "html", "js", "jsfl", "jsp", "jspx", "jar", "jni", "php", "sql", "uml", "xml"};

   static String[] acrrep = {"Action Script", "Active Server Page", "Atom Syndication", "Hyper Text Markup Language", "JavaScript", "JavaScript for Flash IDE", "Java Server Page", "Java Server Page Xml structured", "Java ARchive", "Java Native Integration", "Hypertext PreProcessor", "Structured Query Language", "Unified Modelisation Language", "eXtensible Markup Language"};


puis je replace comme tel :
CODE
for(int i = 0; i < acrstr.length; i++){

           while(str.indexOf(acrstr[i]) != -1){

               str = str.substring(0, str.indexOf(acrstr[i])) + "<acronym title='" + acrrep[i] + "'>" + acrstr[i] + "</acronym>" + str.substring(str.indexOf(acrstr[i]) + acrstr[i].length(), str.length() - 1);

           }

       }


Ca marche impécablement, cependant, j'aimerai rendre cela CASE_NONSENSITIVE... mais je ne sais pas comment le faire sans passer par les regex sad.gif.
wox-xion
je ne laisse pas mes anneries... voici le code pour les acronymes :
CODE
for(int i = 0; i < acrstr.length; i++){

           str = Pattern.compile("(\\p{Blank}|\\p{Punct})" + acrstr[i]).matcher(str).replaceAll("$1<acronym title='" + acrrep[i] + "'>" + acrstr[i] + "</acronym>");

       }
wox-xion
bon, suffit mon monologue ! ohmy.gif j'ai presque terminé, ça va nettement "plus" vite... Cependant... le dernier détail à régler n'est pas des plus moindres... c'est bien sûr, les espaces blancs à transformer en   dans les balises [code:language]...[/code] Comment faire d'après vous, pour que ce soit rapide ?
wox-xion
pour l'instant, j'utilise ceci :
CODE
// tabulation, espaces blancs en quantité

while(str.indexOf("  ") != -1){ // ne fait pas plus de deux boucles

   str = Pattern.compile("([ ]{2})").matcher(str).replaceAll("  ");

}

Ca marche très bien... mais s'il existe mieux, je serai heureux de le savoir wink.gif

NB : la boucle ne se fait que deux fois au maximum, une fois si on a de la chance, zéro fois dans les posts normaux...
liguorien
QUOTE
Voilà, quand je redémarre tomcat, toutes les pages jsp et autres servlets / beans sont \"lents\" à s'exécuter...

C'est normal, les JSP doivent être compilé à leur première utilisation.

QUOTE
J'essaie d'augmenter l'utilisation de la ram par tomcat

fait gaffe, tu vas avoir un admin système qui va venir râler contre Java... Habituellement il faut économiser l'utilisation de la RAM. Si tu veux utiliser plus de RAM, tu n'as qu'à instancier plus d'objets. loool
QUOTE
Voici le bean qui formate justement ces textes : ici

:shock: :shock: :shock:
j'ai bien failli recracher une gorgé de café en regardant ta classe. :mrgreen:

Les regex en Java peuvent être performante si on les utilisent de façon intelligente. Lorsque tu invoques la méthode compile, et bien c'est que tu compile(opération très couteuse) l'expression afin que ce soit plus rapide pour la traiter par la suite. Là dans ta méthode, tu compiles 102 expression à chaque formattage de textes ! Donc pour une page normale d'environ 10 texte, ça fait 1020 compilation par requête.

La classe Matcher n'est pas "thread-safe" mais la classe Pattern oui. Alors tu peux faire la compilation dans un bloc statique afin de ne le faire qu'une seule fois.
vulgarisation :
CODE
import java.util.regex.*;



public class Formatter{

 

  private final static Pattern _pattern = Pattern.compile("lePattern");



  public final String format(String str){

      return _pattern.matcher(str).replaceAll("remplacement'")

  }

}


bon il se fait tard, je suis trop fatiguer pour lire le reste de ton roman tongue.gif
wox-xion
merci, c'est clair que ça change, si on ne définit qu'une fois la compilation... :mrgreen:

pour la classe, je l'ai vraiment rendu plus "petite"... donc le fichier qui est visible n'est plus d'actualité... j'avais fait des choses horribles pour java :oops:

J'espère que ma machine va pas me frapper :oops:
Et c'est clair, là, ça va beaucoup, mais beaucoup plus vite...
Mais je n'ai pas encore mis toutes les compilations en statiques... je vais le faire de ce pas wink.gif

Par contre, question stupide, si j'utilise un bean, puis une deuxième fois... est-ce que la compilation se fait la deuxième fois, pour les éléments statiques ?
Y a-t-il une coupure entre deux utilisation d'un bean ou celui-ci est-il toujours éveillé ? (c'est à dire que s'il n'est plus utilisé, les éléments statiques sont-il persistants ? jusqu'à quel point ?)
wox-xion
ah, au passage, quand je démarre tomcat, il est à 75% de l'utilisation de la ram, c'était pas le cas avant... c'est normal, ça ?
wox-xion
bon, pour les smilies, je fais ça désormais, est-ce que ça suit ton idée correctement ?
CODE
// smilies

   static Pattern[] _smiley = {Pattern.compile("(^| |\\n|\\r)"+":\\)"), Pattern.compile("(^| |\\n|\\r)" + ":\\-\\-\\>:"), Pattern.compile("(^| |\\n|\\r)" + "(:D|:d|:mrgreen:)"), Pattern.compile("(^| |\\n|\\r)" + ":0"), Pattern.compile("(^| |\\n|\\r)" + "8\\)"), Pattern.compile("(^| |\\n|\\r)" + ":/"), Pattern.compile("(^| |\\n|\\r)" + ";\\)"), Pattern.compile("(^| |\\n|\\r)" + "\\^\\^"), Pattern.compile("(^| |\\n|\\r)" + ":(p|P)"), Pattern.compile("(^| |\\n|\\r)" + "8\\|"), Pattern.compile("(^| |\\n|\\r)" + "8:0"), Pattern.compile("(^| |\\n|\\r)" + ":\\=\\)"), Pattern.compile("(^| |\\n|\\r)" + "\\=\\)"), Pattern.compile("(^| |\\n|\\r)" + ":\\$"), Pattern.compile("(^| |\\n|\\r)" + ":\\("), Pattern.compile("(^| |\\n|\\r)" + ":\\."), Pattern.compile("(^| |\\n|\\r)" + ":\\?:"), Pattern.compile("(^| |\\n|\\r)" + ":\\!:"), Pattern.compile("(^| |\\n|\\r)" + ":no:"), Pattern.compile("(^| |\\n|\\r)" + ":mad:"), Pattern.compile("(^| |\\n|\\r)" + ":cute:"), Pattern.compile("(^| |\\n|\\r)" + ":evil:"), Pattern.compile("(^| |\\n|\\r)" + ":\\|"), Pattern.compile("(^| |\\n|\\r)" + ":idea:"), Pattern.compile("(^| |\\n|\\r)" + ":knife:"), Pattern.compile("(^| |\\n|\\r)" + ":female:"), Pattern.compile("(^| |\\n|\\r)" + ":male:"), Pattern.compile("(^| |\\n|\\r)" + ":love:"), Pattern.compile("(^| |\\n|\\r)" + ":lol:"), Pattern.compile("(^| |\\n|\\r)" + "8\\^"), Pattern.compile("(^| |\\n|\\r)" + ":scared:"), Pattern.compile("(^| |\\n|\\r)" + ":zzz:"), Pattern.compile("(^| |\\n|\\r)" + ":\\^"), Pattern.compile("(^| |\\n|\\r)" + ":\\-:"), Pattern.compile("(^| |\\n|\\r)" + ":abstract:"), Pattern.compile("(^| |\\n|\\r)" + ":climat:"), Pattern.compile("(^| |\\n|\\r)" + ":faq:"), Pattern.compile("(^| |\\n|\\r)" + ":firefox:"), Pattern.compile("(^| |\\n|\\r)" + ":flail:"), Pattern.compile("(^| |\\n|\\r)" + ":gallery:"), Pattern.compile("(^| |\\n|\\r)" + ":glomp:"), Pattern.compile("(^| |\\n|\\r)" + ":hands:"), Pattern.compile("(^| |\\n|\\r)" + ":kissbow:"), Pattern.compile("(^| |\\n|\\r)" + ":nolistening:"), Pattern.compile("(^| |\\n|\\r)" + ":nonono:"), Pattern.compile("(^| |\\n|\\r)" + ":realy:"), Pattern.compile("(^| |\\n|\\r)" + ":square:"), Pattern.compile("(^| |\\n|\\r)" + ":sword:"), Pattern.compile("(^| |\\n|\\r)" + ":threaten:"), Pattern.compile("(^| |\\n|\\r)" + ":teddy:"), Pattern.compile("(^| |\\n|\\r)" + ":wave:"), Pattern.compile("(^| |\\n|\\r)" + ":work:"), Pattern.compile("(^| |\\n|\\r)" + ":work2:"), Pattern.compile("(^| |\\n|\\r)" + ":what:"), Pattern.compile("(^| |\\n|\\r)" + ":yummy:")}; // attention, regex  



   static String[] replace = {"smile", "arrow", "biggrin", "surprised", "cool", "confused", "wink", "spin", "razz", "neutral", "eek", "tooth", "yes", "redface", "sad", "potatoheader", "question", "exclam", "no", "mad", "cute", "evil", "eyebrow", "idea", "knife", "female", "male", "love", "lol", "rolleyes", "scared", "sleep", "whistle", "_", "abstract", "climat", "faq", "firefox", "flail", "gallery", "glomp", "handshake", "kissbow", "nolistening", "nonono", "realy", "square", "sword", "threaten", "teddy", "wave", "work", "work2", "what", "yummy"}; // attention aux guillemets



   static String[] title = {":)", ":-->:", ":D", ":0", "8)", ":/", ";)", "^^", ":P", "8|", "8:0", ":=)", "=)", ":\\$", ":(", ":.", ":?:", ":!:", ":no:", ":mad:", ":cute:", ":evil:", ":|", ":idea:", ":knife:", ":female:", ":male:", ":love:", ":lol:", "8^", ":scared:", ":zzz:", ":^", ":-:", ":abstract:", ":climat:", ":faq:", ":firefox:", ":flail:", ":gallery:", ":glomp:", ":hands:", ":kissbow:", ":nolistening:", ":nonono:", ":realy:", ":square:", ":sword:", ":threaten:", ":teddy:", ":wave:", ":work:", ":work2:", ":what:", ":yummy:"}; // attention aux guillemets



... // le début de la fonction

for(int i = 0; i < _smiley.length; i++){

           str = _smiley[i].matcher(str).replaceAll("$1<img src='/smiley:"+replace[i]+"' class='smiley' title='"+title[i]+"' alt='"+title[i]+"' />");

       }
wox-xion
bon, j'ai mis à jour, toute la classe... ici
J'ai mis toutes les compilation Pattern en objets statiques...

Par contre, j'hésite...
Ce n'est pas très lisible pour moi, y a-t-il un moyen d'initialiser dans un blog les valeurs de mes tableaux (j'aimerai créer les tableaux autrement, à partir d'un tableau de base String[] et du pattern (^| |\\n|\\r) pour faire le tableau statique, mais comment le faire pour que ce ne soit fait qu'une fois, est-ce possible ? (c'est pour la lisibilité, et le poids du fichier)

De plus, est-ce que ça va être persistent, je sais pas, mais ça me tracasse... car si les éléments statiques sont recompilés chaque fois que je reappelle le bean (les espacements entre un appel peuvent facilement se mesurer en jours.. :? ), vont-ils être recompiler ?
wox-xion
en tout cas, merci beaucoup, ça va à une vitesse allucinante !!!! biggrin.gif biggrin.gif biggrin.gif biggrin.gif :wink:
wox-xion
bon, bas je vais terminé mon monologue biggrin.gif

j'ai trouvé comment les initialiser... je me disais bien... mais je n'avais jamais utilisé cette syntaxe, d'ailleurs, j'avais posé la question sur ton blog, liguorien wink.gif il y a un moment ^^ ici

et bien tout simple
CODE
static { code... }


c'est bon, la classe est nettement plus lisible, et ça marche toujours aussi vite, c'est super ! biggrin.gif
merci encore d'avoir cassé la monotonie de mon monologue wink.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2009 Invision Power Services, Inc.