Conseil d'optimisation et de lecture de code

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 393 fois - Téléchargée 28 fois

Contenu du snippet

Ce sont queqleus conseils pour perfectionner d'un l'optimisation du code soit le gain de place, de vitesse et de taille nivo RAM; et de deux la lecture de votre code.

Ce nes ont que des conseils vous pouvez appliquer une variante pour la lecture.

Source / Exemple :


Pour coder proprement la première chose à faire, c'est d'écrire en haut de chacun de vos module, classe, form, etc ... 

un Option Explicit celui ci vous obligera à déclarer chacune de vos Variables, quelqu'elle soient, comme cela vous devrait reflechir à chaque intervalle à choisir pour les nombres (ex : si vous savez que ce que vous voulez recevoir est compris entre 0 et 255 alors la variable devra etre de type Byte pour economiser de la RAM, par conséquent pour gagner de la vitesse d'execution.)

Celui-ci peut être mis automatiquement dans 
Outils>>Options>>Editeur "Declaration des variables obligatoires" à cocher.

Deuxieme conseil, pour une meilleur clarté de votre code je vous conseil de mettre des tabulations à chaque fois que vs ferez des opérations avec With, Do While, For, If, ... Et vous pouvez aussi mettre des : pour caser deux implémentation sur une ligne ou deux ligne sur une. De plus n'hésitez pas à effectuer des sauts de ligne d que vous en sentez le besoin.

Ex1 : 

Avant : 

Private Sub Etat(MatEtat() As Byte, Optional Mode As Byte = 0, Optional PseMilli As Long = 1000)
Dim Ind As Long
If MatEtat(0) <> 0 Then
ArtTxt = False
For Ind = 0 To UBound(MatEtat)
If ArtTxt Then Exit Sub
ChgMod MatEtat(Ind)
If Ind <> UBound(MatEtat) Then Pause PseMilli
Next
ElseIf Mode <> 0 Then
ChgMod Mode
End If
End Sub

Apres : 

Private Sub Etat(MatEtat() As Byte, Optional Mode As Byte = 0, Optional PseMilli As Long = 1000)

    Dim Ind As Long
    
    If MatEtat(0) <> 0 Then
        ArtTxt = False
        For Ind = 0 To UBound(MatEtat)
            If ArtTxt Then Exit Sub
            ChgMod MatEtat(Ind)
            If Ind <> UBound(MatEtat) Then Pause PseMilli
        Next
    ElseIf Mode <> 0 Then
        ChgMod Mode
    End If

End Sub

Ex2 :

(Ex : Ligne1 = "Label1.Caption="10""; Ligne2="Rd=CLng(Label1.Caption)*2")

Avant : 

Ligne1
Ligne2

Apres: 

Ligne1:Ligne2 

Troisieme conseil, pour une otpimisation vous devrez trouver toutes les solutions possibles pr choisir la meilleure (la plus rapide ou la moin massive selon vos exigence), cela veut dire que vous devriez faire attention à tous les morceaux de votre code pr le "factoriser".

Ex : 

On a un menu avec un choix entre l'item Rouge, l'item Vert et l'item Bleu.

Code direct  (avant) : 

Private Sub Rouge_Click()

    Rouge.Checked=1
    Vert.Checked=0
    Bleu.Checked=0

End Sub

Private Sub Vert_Click()

    Rouge.Checked=0
    Vert.Checked=1
    Bleu.Checked=0

End Sub

Private Sub Bleu_Click()

    Rouge.Checked=0
    Vert.Checked=0
    Bleu.Checked=1

End Sub

Code modifier (après) : 'Pr ns aider on a remplacer l'item Rouge, Vert et Bleu par un groupe de controle nommé Couleur (dindex de 0 à 2)

Private Sub Couleur(Index As Integer)
    
    Dim Var As Byte

    For Var=0 to Couleur.Count-1
        If Var=Index Then Couleur(Var).Checked=1 Else Couleur(Var).Checked=0
    Next

End Sub

Donc pour les controles on pourra utiliser les groupes de controles (sils ont un lien ensemble - faut il encore le trouver :)).

Sinon on peut utiliser des tableaux pour optimiser, ex : 

(Propriété Interval du Timer réglé à 1000 (ms))

Code direct : 

Dim Cpt As Byte

Private Sub Timer1_Timer()

    Cpt=Cpt+1
    If Cpt>3 Then Cpt=1
    Select Case Cpt
        Case 1
            me.Caption="Salut"
        Case 2
            me.Caption="Ca va bien?"
        Case 3
            me.Caption="Moi tranquille ;)"
    End Select

End Sub

Code optimisé : 

Dim Cpt As Byte, MatTxt as Variant

Private Sub Form_Load()
    
    MatTxt=Array("Salut", "Ca va bien?", "Moi tranquille ;)")

End Sub

Private Sub Timer1_Timer()

    Cpt=Cpt+1
    If Cpt>UBound(MatTxt) Then Cpt=0   
    me.Caption=MatTxt(Cpt)

End Sub

Ainsi on pourrait continuer librement le tableau ss avoir à changer autre chose.

N'oubliez pas une dernière chose, il faut toujours penser à la moindre faille de votre programme, en utilisant soit d On Error Resume Next qui passera une erreur comprise dans une procedure, ou un On Error Goto Ligne1 pour que votre programme aille à cette ligne s'il y a eu une erreur et un On Error Goto 0 pour réinitialiser la gestion de l'erreur dans une procédure.

Votre optimisation vous menera surement à creer des Procedures, des Fonction, mais aussi des modules Publiques, des Dll Active X et des controles OCX.

N'oubliez pas aussi la difference entre un Sub et un Function, le Function Renvoi qq chose alor que le Sub non, et faites attention au nivo des procedure public et privé.

Ex : 

code direct : 

''Ds un module par exemple qqconque sera utiliser par toutes les form

Sub QQonque() 'La c en publique puisquil y a rien
     
    CreerFic "m:\a.txt"

End Sub

Sub CreerFic(Adr As String)'encore en public alor quon en a pas besoin!

    Dim ff As byte

    If Dir(Adr, VbHidden)<>"" Then Exit Sub    

    On Error Resume Next
    
    ff=FreeFile()
    Open Adr For Random As #ff
    Close #ff

End Sub

code otpimisé : 

''Ds un module par exemple qqconque sera utiliser par toutes les form

Sub QQonque() 'La c en publique puisquil y a rien
     
    If CreerFic ("m:\a.txt") Then Debug.Print "Fichier crée" Else Debug.Print "Erreur"
'''Si le fichier a bien été créer CreerFic=True par conséquent il ecrit ds la fenetre espion "Fichier crée" sinon il écrit "Erreur"

End Sub

Private Function CreerFic(Adr As String) As Boolean

    Dim ff As byte

    If Dir(Adr, VbHidden)<>"" Then CreerFic=True:Exit Function

    On Error Goto Fin
    
    ff=FreeFile()
    Open Adr For Random As #ff
    Close #ff
    CreerFic=True

Fin:

End Function

Une dernière chose, n'hésitez surtout pas à schématiser ce que vous voulez faire qd vous avez du mal à le penser vous verrez ça vous aidera grandement.

Conclusion :


En esperant que ça vous aide ;)

Et dsl pr deux ou trois conneries que j'ai pu dire au nivo des types.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
466
Date d'inscription
samedi 16 février 2002
Statut
Membre
Dernière intervention
20 avril 2007

L'ide est lent parce qu'il génère des informations de débogages, c'est à dire que l'exécution de l'application est sans cesse surveillée afin de pouvoir afficher la ligne de code en cours d'exécution. Voilà pourquoi :)

@+
Celiphane
Messages postés
1411
Date d'inscription
mercredi 6 août 2003
Statut
Membre
Dernière intervention
3 mars 2019
1
Woah !
Que dire de mieux. Effectivement, à chaque fois que l'on change la méthode d'optimisation (P-Code, Natif sans optimisation, Optimisation de la rapidité, on coche ou non les croix...). Les résultats n'arrêtent pas de changer et le classement aussi.
Et quelle lenteur dans l'IDE ??? Si quelqu'un sait pourquoi ! Je ne pense pas que cela viennent de la simple utilisation des ressources système j'ai largement assez de ressources (Athlon Barthon 2600 + 512 Mo DDR 400 Mhz).

++
Messages postés
466
Date d'inscription
samedi 16 février 2002
Statut
Membre
Dernière intervention
20 avril 2007

Oui il semble bien que vous ayez raison, j'ai toujours basé mon expérience sur des test DANS l'ide.

Après les quelques révélations dans les messages précédents, j'ai cette fois tester ce code (une Form nommée Form1 et un bouton nommé Command1) :

Private Declare Function GetTickCount Lib "kernel32.dll" () As Long

Private Sub Command1_Click()
Dim d As Long
Dim i As Long
Dim type_byte As Byte
Dim type_int As Integer
Dim type_lng As Long
d = GetTickCount
For i = 1 To 100000000
type_byte = 1
Next i
MsgBox "Temps en ms avec byte : " & CStr(GetTickCount - d)
d = GetTickCount
For i = 1 To 100000000
type_int = 1
Next i
MsgBox "Temps en ms avec integer : " & CStr(GetTickCount - d)
d = GetTickCount
For i = 1 To 100000000
type_lng = 1
Next i
MsgBox "Temps en ms avec long : " & CStr(GetTickCount - d)
End Sub


Et là les résultats RENVERSENT mes appuis :
- testez avec F5 depuis l'ide, et relevez les valeurs de chacuns
- maintenant compiler en sélectionnant "optimiser la rapidité du code" et dans "options avancées" cochez TOUT, tester et hallucinez : le classement change du tout au tout !!! Même MSDN se plante sur ce classement !

Décidément, VB regorge des surprises même pour les plus aguerris !

@+
Celiphane
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
62
un atre conseil.... utiliser Ctrl + F5
ou bien désactiver dans les options "Compilation en arriere plan" et "compilation sur demande"

ca permettra que VB recherche toutes les erreurs tout de suite (nom des variables, declarations........ sans attendre d'arriver dans certaines boucles dans lequelq vos tests ne vous meneront pas forcement (ou pas tout de suite))




pour :
Private Sub Couleur(Index As Integer)

Dim Var As Byte

For Var=0 To Couleur.Count-1
If Var=Index Then Couleur(Var).Checked=1 Else Couleur(Var).Checked=0
Next

End Sub


Si checked vaut 0 ou 1 (comme dans l'exemple proposé) :

Private Sub Couleur(Index As Integer)
Dim Var As Integer
For Var=0 To Couleur.Count-1
Couleur(Var).Checked iif( Var Index, 1 , 0 )
Next
End Sub

ou si Checked est un boolean

Private Sub Couleur(Index As Integer)
Dim Var As Integer
For Var=0 To Couleur.Count-1
Couleur(Var).Checked (Var Index)
Next
End Sub
Messages postés
181
Date d'inscription
jeudi 30 mai 2002
Statut
Membre
Dernière intervention
19 août 2012

Il me semble que sous VB.Net, le type Integer est bani pour être remplacé par le type Long.
Si l'on veut continuer à programmer en VB, on sera bientôt quasi obligé de passer par le Net. Alors prenons tout de suite les bons reflexes et utilisons le type Long :)

@+ et bon prog!
Afficher les 10 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.