Optimiser mon code en vitesse

Résolu
Signaler
Messages postés
723
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
23 janvier 2013
-
Messages postés
723
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
23 janvier 2013
-
Salut !

J'ai fait un algorithme qui permet de reformater un code HTML. Ca marche plutôt bien, le seul problème est qu'il prend environ 20 à 30 second pour traiter un code html qui fait 1200 lignes. Pouvez-vous m'aider pour optimiser mon code en vitesse d'execution?

Voici mon code :

Shared Function ReFormater(ByVal HTML() As String, ByVal Espace As Integer, ByVal AvecTabulation As Boolean, Optional ByVal Progress As Object = Nothing) As String
        If Not Progress Is Nothing Then
            Progress.Value= 0
        End If

        Dim RESULTAT As String = "" ' Est égale au résultat de la fonction
        Dim HTML2 As String = Nothing
        Dim HTML3 As String = Nothing
        Dim tmp As String
        Dim nbr As Integer = 0
        Dim progression As Integer = 0

        ' On pourrais penser que cette boucle est inutile mais elle permet de supprimer les espaces en début de chaque ligne afin de pouvoir tout reformater sans être gêné par d'éventuel espace en début de ligne qui n'aurais rien à faire ici
        For i As Integer = 0 To HTML.Length - 1
            HTML(i) = HTML(i).Trim() ' Supprime les espaces déja présents en début et en fin de chaîne
            ' On vide la variable HTML() dans HTML2
            If i = HTML.Length - 1 Then
                HTML2 = HTML2 & HTML(i)
            Else
                HTML2 = HTML2 & HTML(i) & Environment.NewLine
            End If
        Next

        If HTML2.Contains(Environment.NewLine) Then
            HTML2 = HTML2.Replace(Environment.NewLine, Nothing)
        End If

        HTML3 = HTML2
        progression = HTML2.Length
        For i As Integer = 0 To HTML2.Length
            tmp = HTML2.Substring(i, HTML2.Length - i)
            tmp = tmp.Replace(" ", Nothing) ' Supprime TOUS les espaces afin de transformer par exemple un < html en <html, ce qui fais que c'est lisible par la condition si dessous
            tmp = tmp.ToLower
            ' Pour certaine balise, on va rajouter un ou plusieur retour à la ligne
            If tmp.StartsWith("<html") OrElse tmp.StartsWith("

*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***

6 réponses

Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
37
C'est a étudier,
Ce qui est sur c'est que ton ordre dans tes if est important
car c'est des if qui s'arrete d'interprété des que la conditions est remplit

Si tu mets <td avant <a avant <html ca sera plus optimisé

C'est logique ;-)

Pour les case, c'est pareil il me semble
mais je trouve ca mieux structuré
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
37
Salut,

Regardes avec le stringbuilder ca devra être plus performant
De plus utilises les formats

Le probleme en .net comme en java c'est que les strings sont immuables.
Donc pour éviter les recopies il faut passer par des stringbuilder

sb.append
et
sb.appendformat("{0} - {1}",param1,param2); -- c'est un exemple

Une regexp doit faire le travail de trimming et de mise en forme et de mise en minuscule

Exemple ici :
http://geekswithblogs.net/AnneBougie/archive/2008/09/17/matching-and-grouping-regular-expressions-using-regex-in-c-again.aspx

Quand tu auras trouver n'hésite pas à mettre ta source sur le forum.

Les regexp doivent etre plus puissante que faire du caractère par caractère.
Messages postés
723
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
23 janvier 2013
3
Salut !

Je vais essayer ça, merci. Pendant que j'y pense, est-ce que un Select Case ne serais pas plus rapide aussi à la place des If Else Then ?

 
*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***
Messages postés
723
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
23 janvier 2013
3
Salut !

Alors voila :
J'ai un peu optimisé mon code en travaillant sur l'ordre des If. J'ai également put optimisé le début de la fonction en transformant :

        Dim RESULTAT As String = "" ' Est égale au résultat de la fonction
        Dim HTML2 As String = Nothing
        Dim HTML3 As String = Nothing
        Dim tmp As String
        Dim nbr As Integer = 0
        Dim progression As Integer = 0

en :

        Dim RESULTAT, HTML2, HTML3, tmp As String
        Dim nbr, progression As Integer
        HTML2 = Nothing

J'en ai profité pour faire pareil avec la fonction VelerSoftware.WebSystem.HTML_Tabulation_intelligente_Formatage.Tabluation (qui n'est pas ici^^).

Par contre, le fait d'utiliser un System.Text.StringBuilder m'empêche de faire des chose du genre "If html2.Contains(environement.newline) then" et autre.
Et les Regex.... euuuh, j'ai rien compris en fait

 
*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
37
Ton optimisation de la déclaration ne sert a rien.

Pour les regexp, c'est pour transformer des tag html en lowercase
apres je ne sais pas si ca marche c'est une suggestion

http://fr.wikipedia.org/wiki/Expression_rationnelle
Messages postés
723
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
23 janvier 2013
3
A, ok. Ba, pour les regex, j'ai comme l'impression que ça ne marche pas. Bon, pas trop grave tout de même. Je pense qu'il est déjà pas mal optimisé là.... Puisque je lit le code caractère par caractère, faut pas torp espérer aller très vite, et faut pas rêver d'avoir la même vitesse qui si c'était du C ou C++  =p

Bon bin merci beaucoup =D

@++

ps : dernière question à propos de l'optimisation : http://www.vbfrance.com/forum/sujet-SERT-OPTION-ACTIVER-OPTIMISATION-DANS-VB2008_1263347.aspx

@+++++

 
*** ebaudoux@club.fr ***
*** http://www.velersoftware.fr.nf/ ***