CONSEIL D'OPTIMISATION ET DE LECTURE DE CODE

celiphane Messages postés 466 Date d'inscription samedi 16 février 2002 Statut Membre Dernière intervention 20 avril 2007 - 24 juin 2004 à 18:38
celiphane Messages postés 466 Date d'inscription samedi 16 février 2002 Statut Membre Dernière intervention 20 avril 2007 - 26 juin 2004 à 20:25
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/23968-conseil-d-optimisation-et-de-lecture-de-code

celiphane Messages postés 466 Date d'inscription samedi 16 février 2002 Statut Membre Dernière intervention 20 avril 2007
26 juin 2004 à 20:25
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
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
26 juin 2004 à 17:10
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).

++
celiphane Messages postés 466 Date d'inscription samedi 16 février 2002 Statut Membre Dernière intervention 20 avril 2007
26 juin 2004 à 13:27
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
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
25 juin 2004 à 22:36
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
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012
25 juin 2004 à 17:49
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!
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
25 juin 2004 à 14:34
Désolé, je suis pas tout à fait d'accord avec Celiphane, et pourtant il a plusieurs prouvé ses connaissances.

Voici un copier/coller de ce que j'ai trouvé dans les MSDN VS 6.0


Utilisez des variables de type Long et des valeurs mathématiques de type Integer :

Dans les opérations arithmétiques, évitez les variables Currency, Single, et Double. Utilisez des variables de type Long chaque fois que vous le pouvez, surtout dans des boucles. Comme le type Long est le type de donnée natif du processeur 32 bits, les opérations sont très rapides ; si vous ne pouvez pas utiliser des variables de type Long, les types de données Integer ou Byte sont alors le meilleur choix. Dans beaucoup de cas, vous pouvez utiliser des entiers de type Long là où une valeur en virgule flottante pourrait être requise. Par exemple, si vous définissez toujours la propriété ScaleMode de tous vos contrôles de feuilles et d'images en twips ou en pixels, vous pouvez utiliser des entiers de type Long pour toutes les valeurs déterminant la taille et la position des méthodes de contrôles et de graphiques.

Lorsque vous calculez une division, utilisez l'opérateur de division des entiers (\) si vous n'avez pas besoin d'un résultat décimal. Un nombre entier est toujours plus rapide qu'un nombre décimal, car il n'est pas nécessaire de décharger l'opération vers un processeur mathématique. Si vous devez calculer des valeurs décimales, le type de donnée Double est plus rapide que le type de donnée Currency.

Dans le tableau suivant, les types de données numériques sont classés selon la vitesse de calcul.

Type de donnée numérique Vitesse

Long La plus rapide
Integer
Byte
Single
Double
Currency La plus lente

Pour la fiche complète, tapez Simplement "Optimisation du code", emplacement = "Concepts Visual Basic"

Bonne prog
++
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
24 juin 2004 à 23:42
Personnellement entre byte, integer et long, je choisit toujours le long ! C'est effectivement ce que l'on appelle le "mot normal" de nos processeur 32 bits car il est coder sur 4 octets et que 4*8=32 alors que l'integer est codé sur 2 octets. A l'époque de VB4 et des processeurs 16bits on utilisait effectivement l'integer de préférence mais aujourd'hui on utilisera plutot le long sur un processeur 32bits et quand on aura tous des processeurs 64bits, il faudrait travailler en Currency mais comme vb ne travaillera jamais en 64bits de toute façon on restera avec les long de préférence. Le test de celiphane est tres bon mais faiote le avec un long, vous verrez que le long est plu lent que l'integer !!!!!!!!! BEN QU'EST-CE QUI RACOMPTE ALORS ?????
Compiler le projet de test de celiphane et lancer l'EXE obtenu ... Le Integer et le long sont égaux (~) et le byte est toujours battu. A noter que l'égalité entre le long et le integer vient du fait que l'opération effectuer dans la boucle est relativement simple et le compilateur prend sans doute des raccourcis à un moment donné
gandalfkhorne Messages postés 70 Date d'inscription dimanche 11 janvier 2004 Statut Membre Dernière intervention 1 octobre 2004
24 juin 2004 à 20:40
hum hum, pour le Byte je m'excuse car je ne voyais pas pkoi vb aurait été plus rapide, sinon le ":" a été mis pour un gain de place soit pour la lecture du code plus facile.

Sinon je ne vois pa pkoi tu me parle des private et public alor ke ds mon exemple le seul truc de public c mon sub (voir le deuxieme), repond moi stp?
tmcuh Messages postés 458 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 18 avril 2009
24 juin 2004 à 19:08
effictivement celiphane, tu m'as persuadé... moi qui utilisé dès que je pouvais des "byte" parce pour moi cà prenais moins de place, mais c clair que niveau rapidité y'a pas photo... sinon ben pour le tuto, pas mal fait à part que tu parle chose pour moi inutile au point de vue l' optimisation, car l'optimisation est quand meme l'acceleration d'une commande par rapport à un état antérieur hors le ":" ne permet pas d'acceler, fais un test tu verra par toi meme. Son seul but est de réduire d'une ligne le code mais nullement de l'améliorer ...en effet le compilateur décompile cà et met cà l'un en dessous de l'autre ;-).
Aussi je pense que quand on fait un ocx ou dll, on met le 3/4 en private et non en sub comme tu le fait, car tout le monde y a accès et pourrais faire planter l'ocx si il est mal fait...
celiphane Messages postés 466 Date d'inscription samedi 16 février 2002 Statut Membre Dernière intervention 20 avril 2007
24 juin 2004 à 18:38
c'est bien de vouloir aider les débutants, cependant je me devais de relever une énormé bourde dans ce tuto pour premier pas, tu dis :

"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."

c'est complètement FAUX.
Le type de variable le plus rapide en VB est l'INTEGER. Utiliser un byte en lieu et place d'un integer revient à ralentir l'execution de 1/3 ou plus, sur par exemple une itération. Cela provient de l'encodage utilisé en mémoire. Donc utilisez TOUJOURS un integer, le seul intérêt du byte demeure dans le stockage physique (oui car pour la RAM c'est quand même plus que négligeable, surtout pour un itérateur) ou bien dans le traitement des fichiers, les tampons de réception pour les tableaux d'octets etc...

La preuve de la lenteur du Byte sur l'integer ou le long ?

Faites une Form1, un Command1 (un bouton) et collez ça dans le code, puis testez :
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
d = GetTickCount
For i = 1 To 1000000
type_byte = 1
Next i
MsgBox "Temps en ms avec byte : " & CStr(GetTickCount - d)
d = GetTickCount
For i = 1 To 1000000
type_int = 1
Next i
MsgBox "Temps en ms avec integer : " & CStr(GetTickCount - d)
End Sub


@+
Celiphane
Rejoignez-nous