[C#] Performances de certaines classes [résolu]

Je m’inquiètes de la performance de mon programme qui abuse de certaines fonctionnalités de .net, telles que les expressions régulière: effectivement mon programme grossit a vue d’oeil et comme a ralentir pas mal. J’ai par exemple dans mon programme plein de Console.WriteLine (pour afficher des informations sur le déroulement) et disons que j’arrive pratiquement a lire les messages de la Console en tant réel (du moins en mode déboguage).

Est ce que c’est normal?

Pour info j’utilise beaucoup:
ArrayList >> j’ai besoin de listes chainées
RegularExpressions >> j’ai besoin d’interpréter certains chaines passées a mon application. A la limite je pourrais peut être remplacer les RegExp…
UDPSocket >> parce qu’il ya du réseau dedans

[edit] mouahahah ca se voit que c’est le matin, matez le texte en gras :stuck_out_tongue:

Ben la comme ca on peut pas dire sans savoir ce que tu fais en detail. Si tu sais ce que tu fais c’est pas lent, maintenant ptet que ce que tu fais demande bcp de temps et que c’est normal. Encore une fois c’est pas avec juste « des regex, du reseau, du console.writeline » qu’on peut savoir :stuck_out_tongue: Enfin ca a rien d’intrinseque au C# (meme si les perfs des regex dans la 1.1 sont pas au top c’est loin loin loin d’etre minable), quand je vois tout ce qu’on fait dans le temps qu’on le fait dans le designer de VS ca m’impresionne toujours :stuck_out_tongue:

Euh c’est du .net 2.0 beta :stuck_out_tongue: j’ai pas les sous pour m’acheter la suite Visual Studio .Net 1

[edit de précisions]

Bah en fait je pense pas que ca soit sensé être lent:

L’application « boucle » (c’est un serveur UDP qui doit faire un traitement a chaque boucle). Dans une boucle, j’effectue environ une dizaine de RegExp (qui peut monter a 10000 aussi en phase de production).

dans ma classe j’ai 3 ArrayList qui dans mes tests contiennent au maximum une dizaine d’éléments (par contre ca risque salement de monter entre 5000 et 10000 éléments en phase de production). Les informations de ces tables sont lues plusieurs fois par boucle (entre 1 et 4 fois environ)

l’UDPSocket envoie entre 4 et 10 messages par boucle et en recoit a peu près autant.

Ca avance pas plus :stuck_out_tongue: si tu fais mal tes regex et qu’elles backtraquent trop (si t’as deja suivit un cours de regex) c’est possible d’exploser exponentiellement le temps de calcul avec une toute petite regex alacon™. T’es sur que si t’as plusieurs thread t’as pas des lock de la mort qui bloquent tout? Sans avoir le code complet pour profiler, y a des dizaines de trucs que t’as pu « mal faire », si la reponse que tu cherches c’est « c’est lent une ArrayList » ou, c’est lent de faire x, y ou z en C# c’est mort. C’est pas specialement plus lent que n’importe ou ailleurs, surtout en server side pur. Avec un prog qui fait aussi peu de choses (reativement parlant) que le tient, si t’as un probleme de vitesse, c’est un probleme d’algo.

J’ai pas fait de cours de regexp, mais mes regexp servent juste a valider des chaines (avec des matchs etc…). C’est pas du code threadé, donc je ne pense pas qu’il y ai des locks (c’est pour ca que j’ai utilisé UDP, d’ailleurs, j’avais pas envie de me faire chier a faire des threads pour du TCP, etc…).

Le backtracking c’est quand ton expression s’engage dans une branche pour tenter de matcher et qu’elle a plusieurs possibilite et que puisque le match est pas bon elle doit revenir en arriere et essayer l’autre possibilite.

C’est pour ca qu’il faut faire des expression les plus specifique possible qui eliminent le plus vite possible les cas qui matchent pas. En particulier | est le tueur de vitesse d’execution si il est mis au mauvais endroit.

Un peu d’info http://msdn.microsoft.com/library/default…acktracking.asp

Effectivement j’ai quelques | dans mes expressions régulières: essentiellement pour matcher des numéros de série:

(?<1>[0-9|A-F|a-f|-]+)

C’est quoi cette expression ? <1> d’après le site, tu peux pas mettre un truc qui commence par un chiffre entre <> oO => ici

Et puis faut pas mettre de | entre (ptet qu’il corrige tout seul), et il manque \ devant ‹ - › (idem) =>

j’aurais mis (?[0-9A-Fa-f-]+)
noooooon ?

Attention ce ne sont pas des RegExp Perl mais microsoft :P. Le <1> est un tag qui renseigne de quel group fait partie le match.

Enfin moi j’ai pris ces regexp d’un exemple et ca a l’air de marcher pas mal…

Laissez tomber c’est le mode déboguage qui ralentit tout a mort :stuck_out_tongue: l’application en release est rapide :P.