celiphane
Messages postés466Date d'inscriptionsamedi 16 février 2002StatutMembreDernière intervention20 avril 2007
-
24 juin 2004 à 18:38
celiphane
Messages postés466Date d'inscriptionsamedi 16 février 2002StatutMembreDernière intervention20 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.
celiphane
Messages postés466Date d'inscriptionsamedi 16 février 2002StatutMembreDernière intervention20 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és1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 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és466Date d'inscriptionsamedi 16 février 2002StatutMembreDernière intervention20 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és181Date d'inscriptionjeudi 30 mai 2002StatutMembreDernière intervention19 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és1411Date d'inscriptionmercredi 6 août 2003StatutMembreDernière intervention 3 mars 20191 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és4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 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és70Date d'inscriptiondimanche 11 janvier 2004StatutMembreDerniè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és458Date d'inscriptiondimanche 22 décembre 2002StatutMembreDernière intervention18 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és466Date d'inscriptionsamedi 16 février 2002StatutMembreDernière intervention20 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
26 juin 2004 à 20:25
@+
Celiphane
26 juin 2004 à 17:10
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).
++
26 juin 2004 à 13:27
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
25 juin 2004 à 22:36
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
25 juin 2004 à 17:49
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!
25 juin 2004 à 14:34
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
++
24 juin 2004 à 23:42
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é
24 juin 2004 à 20:40
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?
24 juin 2004 à 19:08
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...
24 juin 2004 à 18:38
"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