Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
11 août 2003 à 16:37
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 2006
-
16 mars 2005 à 11:19
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 16 mars 2005 à 11:19
JoePatent < Je suis tout a fait d'accord avec toi ! Il est posible que 12 lignes de code soient pus rapide que 4 ! Mais à vitesse égal, je préfère les 4 lignes.
Excuses-moi encore d'avoir écorner tes propos !
sans rancune ?
Afyn
Messages postés608Date d'inscriptionsamedi 3 août 2002StatutMembreDernière intervention22 décembre 2016 15 mars 2005 à 20:21
Restez zen ...
C'est de l'optimisation ... pour une bonne vie et une
bonne collectivité.
Allez bonne prog à tous
Afyn - Navedac
JoePatent
Messages postés171Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention20 juillet 2008 15 mars 2005 à 19:23
crenaud76 ->"Alors allez jusqu'à dire qu'un code est plus lisible s'il comporte plus de ligne, j'en suis pas sur du tout. Moi, je préfère 4 lignes bien claire que 12 trop longues !!! "
Ca ne repond pas a la premisse de depart. OPTIMISATION signifie avoir un gain de performance.
Tes 4 lignes sont-elles plus performantes que les 12 lignes ? Si il n'y a pas de difference, pourquoi mettre ca dans un TUTORIEL d'optimisation.
Si tu veux me citer, fais le comme du monde ! voici ce que j'ai dit : "Tu ne gagne rien a procéder de la sorte, tu as juste moins de ligne mais aussi moins de clareté."
Où vois-tu "pas lisible du tout" dans cet extrait hors contexte ?
N'importe quoi...
crenaud76
Messages postés4172Date d'inscriptionmercredi 30 juillet 2003StatutMembreDernière intervention 9 juin 200628 15 mars 2005 à 18:14
Je viens de découvrir ce tuto, et je reviens sur l'histoire d'utiliser les With et End With ou pas !
Je n'ai jamais désassembler une source VB de ma vie, mais je peux dire que tous les tests que j'ai pu faire sur le sujet (optimisation de la vitesse du code) m'ont amener à penser que With ... End With fait toujours gagner du temps ! Et encore plus si on le sort des boucles, bien sûr !! Et les imbrications de With ... End With sont aussi avantageuses.
Pour finir, je reviendrais aussi sur le cas de ceci ...
'Avant
If b = 27 Then
a = True
Else
a = False
End If
'Après
Dim a As Boolean
a (b 27)
JoePatent trouve la solution 'Après' pas du tout lisible !! Moi cela me parle bien ! Peut-être est-ce parce que j'ai fait du C avant le VB et que a = (b==27) est totalement lisible en C et que le fait que l'opérateur d'affectation et celui de comparaison de l'égalité sont identique en VB, contrairement à ceux du C !! Ce qui en soit est déjà une entrave à la bonne lisibilité du code VB, mais on va pas réinventé VB maintenant !! Alors allez jusqu'à dire qu'un code est plus lisible s'il comporte plus de ligne, j'en suis pas sur du tout. Moi, je préfère 4 lignes bien claire que 12 trop longues !!! Cela reste une affaire de goût. L'important c'est que si tu maintiens ton propre code, il te faut adopter une ligne de conduite (pour pondre des lignes de code, justement) qui te convienne et si tu maintiens du code de groupe ou qu'un groupe maintient ton code, il faut impérativement que le groupe se mette d'accord avant de pondre la moindre ligne de code.
sinon je met un 10/10 au tuto, même si comme certain, je connaissait la plupart des astuces (certaines on toutefois retenu toute mon attention !!!)
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 7 mars 2005 à 09:26
étrange, en effet... tu gagnerais davantage, je pense, en ne recalculant pas tout le temps QBColor(4)...(bien que ce ne soit pas l'objet de ta demonstration)
krissssss
Messages postés88Date d'inscriptionjeudi 26 décembre 2002StatutMembreDernière intervention 2 janvier 2007 6 mars 2005 à 11:59
Une petite optimisation pour remplire une picture box avec Pset():
picture1.Cls
For ix = 0 To 1000
For iy = 0 To 1000
picture1.PSet (ix, iy), QBColor(1)
Next iy, ix
picture1.Cls
For ix = 0 To 1000000
picture1.PSet (Int(ix / 1000), ix Mod 1000), QBColor(4)
Next ix
<OBSERVATIONS>
Dans la 2ème méthode on gagne 1 seconde d'éxécution en myenne.
Bisarement, on effectue des calculs et une conversion dans cette 2ème façon.
De plus, on a une variable en moins !!!
A-t-on un gain en mémoire ?
Merci aux nombres premiers ;-)
JoePatent
Messages postés171Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention20 juillet 2008 7 mai 2004 à 21:40
si tu Fais un Do...While, VB teste la condition a chaque itération
Avec une boucle For aussi. Sauf que tu n'as pas a gerer le compteur qui permet de mettre la condition valide pour la sortie de boucle.
Les performances sont équivalente pour les deux type de boucle
FeelCode
Messages postés278Date d'inscriptionvendredi 16 avril 2004StatutMembreDernière intervention27 avril 20061 6 mai 2004 à 19:02
Hello
Bon l'optimisation du code je connai pas du tout :P
donc j'ai apris quelque truc sympa ici mai je ne mai pas de note puisque j'y connait rien :
a par cela j'avais fait des test et une boucle
for I= 1 to 100000
next I
Est plus rapide qu'un boucle do ou while:)
En ce moment j'essaye d'aprendre a utiliser des ocx et comme sa rend plus lent le code j'aurai voulu savoir qu'elle pourrait être l'avantage des ocx, car je compte mettre aussi un petit tuto sure les ocx :)
Nix ajoute une section optimisation du code et des interface et temp qu'a faire pour directx :D
Souriez vous ête lu :D
Afyn
Messages postés608Date d'inscriptionsamedi 3 août 2002StatutMembreDernière intervention22 décembre 2016 2 févr. 2004 à 23:12
-> Drakken
Tu as raison, l'important c'est de participer ()
Dans le MSDN, il y a pas mal d'articles sur les optmisations, je pense que ca vaut le coup de les lire. Ca reprend pas mal de chose écrites ici même ...
A+
Afyn
cs_Drakkhen
Messages postés23Date d'inscriptionvendredi 14 mars 2003StatutMembreDernière intervention14 janvier 2005 2 févr. 2004 à 21:17
Ah okay... Je pensais que les expressions renvoyaient toutes une valeur String, merci de l'info. Ce qui veut dire que je vais me retaper vite fait une appli, bref...
Afyn : sauf si on commence tôt, avec le genre d'âge où on est content de découvrir qu'on peut se servir d'une variable :oP
cs_mehdibou
Messages postés365Date d'inscriptionvendredi 24 mai 2002StatutMembreDernière intervention18 octobre 2004 2 févr. 2004 à 13:17
En réponse à Drakkhen, oui, Mid$, Left$, Chr$ et autres sont différentes de Mid, Left, Chr ... car elles retournent une chaine de caractères (d'où le $) au lieu d'un Variant, et après certains tests on remarque rapidement qu'avec le $ c'est plus rapide car la conversion Variant->String est supprimée.
Dans tous les cas, un Variant est toujours plus lent qu'un autre type de base.
Afyn
Messages postés608Date d'inscriptionsamedi 3 août 2002StatutMembreDernière intervention22 décembre 2016 2 févr. 2004 à 08:53
-> un peu jeune pour Prog sur ATARI !!!
/|
Vive ATARI
Afyn
cs_Drakkhen
Messages postés23Date d'inscriptionvendredi 14 mars 2003StatutMembreDernière intervention14 janvier 2005 2 févr. 2004 à 08:30
Conseils utiles et assez complets, merci :o)
Mais y'a 2-3 trucs qui me paraissent un peu floues...
'Avant
If b >= 0 And b < 255 Then
a = 32767
End If
'Après (à utiliser avec précaution)
If (b And 255) = b Then
a = 32767
End If
Dans la première vérification, tu admets une valeur allant de 0 à 254, mais dans la deuxième, tu admets en plus la valeur 255.
'Après (bitmask)
cb = Couleur And 255&
cg = (Couleur And &HFF00&) / 256&
cr = (Couleur And &HFF0000) / &H10000
End Sub
Là, il me semble que tu as inversé les variables "rouge" et "bleu" dans le 2me exemple. :o)
'Après (selon besoins de préçision)
Declare Sub Sleep Lib "kernel32" (ByVal DureeMS As Long)
Sub Wait2(Duree As Single)
Dim t1 As Single
t1 = Timer + Duree
Do While Timer < t1
DoEvents '<= evite de bloquer le système
Sleep 1& '<= libère le CPU pendant 1 milliseconde (évite de chauffer)
Loop
End Sub
Le Sleep est une bonne idée pour libérer un peu le CPU, mais le problème (comme les contrôles Timer, l'API GetTickCount, et du style) sont de l'ordre des ~50/~15 ms selon le système d'exploitation (9X/NT). Et ça enlève énormément de précision selon la nature du programme (Animation, DirectX, ...).
Une question concernant les chaînes de caractères, les instructions Left$, Mid$, etc... sont-elles différentes des Left, Mid, etc... ?
En tout cas, c'est cool de voir des sources utiles. ;o)
PS : je jurerais que t'étais sur C64 ou Atari vu les I dans les boucles.. :o)
Afyn
Messages postés608Date d'inscriptionsamedi 3 août 2002StatutMembreDernière intervention22 décembre 2016 24 janv. 2004 à 18:20
Pour afficher des User Control (et les rafraichir) y a t-il une
méthode d'optimisation ?
Afyn
(National Association of Vilgenis, Erudits, Dundees And Carrierist )
ou
(Nez Au Vent Et Doigt Au C....
... Au Ciel surement !)
Proger
Messages postés248Date d'inscriptionvendredi 10 novembre 2000StatutMembreDernière intervention19 décembre 2008 24 janv. 2004 à 14:33
Heu... ouais... c'est pas flagrant... l'algo dans l'exemple n'est pas extra...
En revanche, c'est plus sensible (parfois bcp+) dans ceci :
avant :
Dim i as long, j as long
for i = 1 to 1000
'code...
for j = 1 to 1000
'code
next j
next i
après :
dim i as long, j as long
i=1
do while i <= 1000
'code...
j=1
do while j <= 1000
'code
j=j+1:loop
i=i+1:loop
En gros c'est avantageux dans les boucles imbriqués, surtout si les "incrementals" (i, j) sont utilisés pour la déclaration des boucles interne (do while j < i ...).
Maintenant tu me diras "on en fait pas tout les jours des boucles imbriqués" ... arf :)
ps : "Navedac" ??
Afyn
Messages postés608Date d'inscriptionsamedi 3 août 2002StatutMembreDernière intervention22 décembre 2016 24 janv. 2004 à 11:34
Rectification ...
Il y a un leger gain pour DO While
Mais bon c'est pas flagrant
A+
Afyn
Afyn
Messages postés608Date d'inscriptionsamedi 3 août 2002StatutMembreDernière intervention22 décembre 2016 24 janv. 2004 à 11:26
J'ai fait un test de ce que tu as écrit :
'Avant
For i = 1 To 150000
Next i
'Après (vitesse a vérifier en benchmark post-compilatoire : varie selon l'algo)
Dim i As Long
i = 1
Do While i <= 150000
i = i + 1
Loop
' nota : très utile lorsque vous devez imbriquer des boucles.
J'ai pas vraiment trouver de gain !!!
Je dirais même que pour les boucle For Next il y a un leger
avantage (grande boucle).
Donc les amis continuez a utiliser For Next ...
Afyn
Navedac
PS si tu veux je t'envois le petit prog de test par mail.
cs_mehdibou
Messages postés365Date d'inscriptionvendredi 24 mai 2002StatutMembreDernière intervention18 octobre 2004 17 août 2003 à 19:25
Très intéressant, je connaissais la majorité des astuces mais certaines me laissent sceptique (tu as fais des tests pour tous les exemples ?). La plupart des optimisations devraient être effectuées par les compilo...si le compilo de VB était bon.. et apparemment, ce n'est pas le cas.
Tu indique d'utiliser vbCompareBinary car plus rapide, il faut bien sûr préciser que parfois on a besoin d'une comparaison avec vbCompareText.
Les instructions Close et Reset ne sont pas totalement identiques mais la différence est minime.
Dans les fonctions (ou plutot les commandes) peu utilisées, j'ajouterai :
- l'instruction Mid$() dont la syntaxe est particulière puisqu'elle est celle d'un assignement.
- les fonctions IIf(), Choose(), Switch()
Et pour finir, je conseille un article à tous les développeurs vb qui utilisent les chaines de caractères avec les API (paske c vraiment la merde avec leur unicode à la con ; et ça devient encore pire quand on veut interférer avec un autre langage) : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnw32dev/html/ora_apiprog6_topic1.asp
Proger
Messages postés248Date d'inscriptionvendredi 10 novembre 2000StatutMembreDernière intervention19 décembre 2008 12 août 2003 à 13:29
En effet, il ne faut pas toujours utilisé With et End With. parfois ça améliore, parfois ça déteriore. En fait, c'est surtout avec directX que tu gagne en performance : utilise .BltFast au lieu de DDS7.BltFast dans une grosse boucle et la différence se ressent immédiatement sur le framerate.
Pour le déasm, aha evidemment je t'attendais au tournant :) . En fait, tout dépend comment tu compiles. en faisant un code qui utilise essentiellement les instructions de base, et en supprimant tout les contrôles (opt. avancés) on se débarrase de 3/4 des appels à msvbm60. Un __vbaVarForInit et __vbaVarForNext sera remplaçé par un petit jne ... En fait, il serai judicieux de faire un tutoriel sur le compilateur lui-même...
cs_shaoni
Messages postés186Date d'inscriptionmercredi 11 avril 2001StatutMembreDernière intervention12 septembre 2007 12 août 2003 à 12:31
il ya quand meme un truc etonnant c'est que tu preconise l'usage de with
end with avec les objects
alors que un autre test sur ce site prouve la lenteur flagrante de ce procéder !!
ps:faudra que tu explique sur quoi tu te base en desassemblant un exe vb parce que à part l'ordre des call tu passe ton temp dans les fonction de msvbrun !
ceci dit bon boulot quand meme hein !
Proger
Messages postés248Date d'inscriptionvendredi 10 novembre 2000StatutMembreDernière intervention19 décembre 2008 11 août 2003 à 22:06
bah, en compilant le prog et en le décompilant en asm, la différence est immédiate. importer une fonction (je parle d'api) est obligatoirement plus lent a exécuté (temps cpu) que de coder soi-même la fonction et de l'appelé avec un simple "jmp near"... l'exemple que tu as choisi répond aussi a cette règle.
JoePatent
Messages postés171Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention20 juillet 2008 11 août 2003 à 21:45
Il y a de bonnes idées mais il faut être prudent. L'optimisation se fait au nombre d'opération pas au nombre de ligne de code.
Un code clair et simple est plus facile a modifier et à maintenir.
Exemple simple :
'Avant
If b = 27 Then
a = True
Else
a = False
End If
'Après
Dim a As Boolean
a (b 27)
Tu ne gagne rien a procéder de la sorte, tu as juste moins de ligne mais aussi moins de clareté.
L'optimisation d'un code source se fait avec une charte mathematique des opérations mathématique effectué par le processeur afin de gagner des cycles...
C'est plus compliqué que simplement changer toute les itérations par de la récursive afin d'avoir moins de lignes...
Bon travail tout de même !
NoRabbit
Messages postés224Date d'inscriptionsamedi 26 juillet 2003StatutMembreDernière intervention30 mars 2009 11 août 2003 à 19:15
très intéressant, je n'en connaissais pas tellement et ce tuto est une très précieuse aide.
n'hésite pas à en remettre, ça m'intéresse fort
Bricomix
Messages postés340Date d'inscriptionvendredi 11 octobre 2002StatutMembreDernière intervention14 février 2005 11 août 2003 à 17:37
Oups j'ai mis 9/10 au lieu de 10/10 mais bon excuse-moi...
Bricomix
Messages postés340Date d'inscriptionvendredi 11 octobre 2002StatutMembreDernière intervention14 février 2005 11 août 2003 à 17:33
J'ai enregistré cette page comme ça je l'aurai toujours...
10/10
cs_dragon
Messages postés2336Date d'inscriptionsamedi 14 juillet 2001StatutMembreDernière intervention 5 mai 20096 11 août 2003 à 17:04
excellent, rien à redire
bien que pour la plupart, ils sont très connu, il faudrais presque faire un dossier complet sur les optimisation et ici c'est un bon départ
Nix, on demande une nouvelle section sur ton site lol
cs_OphidiaN
Messages postés235Date d'inscriptionmercredi 4 avril 2001StatutMembreDernière intervention 9 novembre 2007 11 août 2003 à 16:38
sur le cul... j'en connaissais mais alors là.... merci :)
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 11 août 2003 à 16:37
bon apercu d'un certain nombre d'ameliorations.
je suis content de voir que je m'en servais deja de la plupart :D
16 mars 2005 à 11:19
Excuses-moi encore d'avoir écorner tes propos !
sans rancune ?
15 mars 2005 à 20:21
C'est de l'optimisation ... pour une bonne vie et une
bonne collectivité.
Allez bonne prog à tous
Afyn - Navedac
15 mars 2005 à 19:23
Ca ne repond pas a la premisse de depart. OPTIMISATION signifie avoir un gain de performance.
Tes 4 lignes sont-elles plus performantes que les 12 lignes ? Si il n'y a pas de difference, pourquoi mettre ca dans un TUTORIEL d'optimisation.
Si tu veux me citer, fais le comme du monde ! voici ce que j'ai dit : "Tu ne gagne rien a procéder de la sorte, tu as juste moins de ligne mais aussi moins de clareté."
Où vois-tu "pas lisible du tout" dans cet extrait hors contexte ?
N'importe quoi...
15 mars 2005 à 18:14
Je n'ai jamais désassembler une source VB de ma vie, mais je peux dire que tous les tests que j'ai pu faire sur le sujet (optimisation de la vitesse du code) m'ont amener à penser que With ... End With fait toujours gagner du temps ! Et encore plus si on le sort des boucles, bien sûr !! Et les imbrications de With ... End With sont aussi avantageuses.
Pour finir, je reviendrais aussi sur le cas de ceci ...
'Avant
If b = 27 Then
a = True
Else
a = False
End If
'Après
Dim a As Boolean
a (b 27)
JoePatent trouve la solution 'Après' pas du tout lisible !! Moi cela me parle bien ! Peut-être est-ce parce que j'ai fait du C avant le VB et que a = (b==27) est totalement lisible en C et que le fait que l'opérateur d'affectation et celui de comparaison de l'égalité sont identique en VB, contrairement à ceux du C !! Ce qui en soit est déjà une entrave à la bonne lisibilité du code VB, mais on va pas réinventé VB maintenant !! Alors allez jusqu'à dire qu'un code est plus lisible s'il comporte plus de ligne, j'en suis pas sur du tout. Moi, je préfère 4 lignes bien claire que 12 trop longues !!! Cela reste une affaire de goût. L'important c'est que si tu maintiens ton propre code, il te faut adopter une ligne de conduite (pour pondre des lignes de code, justement) qui te convienne et si tu maintiens du code de groupe ou qu'un groupe maintient ton code, il faut impérativement que le groupe se mette d'accord avant de pondre la moindre ligne de code.
sinon je met un 10/10 au tuto, même si comme certain, je connaissait la plupart des astuces (certaines on toutefois retenu toute mon attention !!!)
7 mars 2005 à 09:26
6 mars 2005 à 11:59
picture1.Cls
For ix = 0 To 1000
For iy = 0 To 1000
picture1.PSet (ix, iy), QBColor(1)
Next iy, ix
picture1.Cls
For ix = 0 To 1000000
picture1.PSet (Int(ix / 1000), ix Mod 1000), QBColor(4)
Next ix
<OBSERVATIONS>
Dans la 2ème méthode on gagne 1 seconde d'éxécution en myenne.
Bisarement, on effectue des calculs et une conversion dans cette 2ème façon.
De plus, on a une variable en moins !!!
A-t-on un gain en mémoire ?
Merci aux nombres premiers ;-)
7 mai 2004 à 21:40
Avec une boucle For aussi. Sauf que tu n'as pas a gerer le compteur qui permet de mettre la condition valide pour la sortie de boucle.
Les performances sont équivalente pour les deux type de boucle
6 mai 2004 à 19:02
Bon l'optimisation du code je connai pas du tout :P
donc j'ai apris quelque truc sympa ici mai je ne mai pas de note puisque j'y connait rien :
a par cela j'avais fait des test et une boucle
for I= 1 to 100000
next I
Est plus rapide qu'un boucle do ou while:)
En ce moment j'essaye d'aprendre a utiliser des ocx et comme sa rend plus lent le code j'aurai voulu savoir qu'elle pourrait être l'avantage des ocx, car je compte mettre aussi un petit tuto sure les ocx :)
Nix ajoute une section optimisation du code et des interface et temp qu'a faire pour directx :D
Souriez vous ête lu :D
2 févr. 2004 à 23:12
Tu as raison, l'important c'est de participer ()
Dans le MSDN, il y a pas mal d'articles sur les optmisations, je pense que ca vaut le coup de les lire. Ca reprend pas mal de chose écrites ici même ...
A+
Afyn
2 févr. 2004 à 21:17
Afyn : sauf si on commence tôt, avec le genre d'âge où on est content de découvrir qu'on peut se servir d'une variable :oP
2 févr. 2004 à 13:17
Dans tous les cas, un Variant est toujours plus lent qu'un autre type de base.
2 févr. 2004 à 08:53
/|
Vive ATARI
Afyn
2 févr. 2004 à 08:30
Mais y'a 2-3 trucs qui me paraissent un peu floues...
'Avant
If b >= 0 And b < 255 Then
a = 32767
End If
'Après (à utiliser avec précaution)
If (b And 255) = b Then
a = 32767
End If
Dans la première vérification, tu admets une valeur allant de 0 à 254, mais dans la deuxième, tu admets en plus la valeur 255.
Sub DecomposeRGB(Couleur As Long)
'Avant (maths)
cb = Int(Couleur / 65536)
cg = Int((Couleur - cb * 65536) / 256)
cr = Couleur - cg * 256 - cb * 65536
'Après (bitmask)
cb = Couleur And 255&
cg = (Couleur And &HFF00&) / 256&
cr = (Couleur And &HFF0000) / &H10000
End Sub
Là, il me semble que tu as inversé les variables "rouge" et "bleu" dans le 2me exemple. :o)
'Après (selon besoins de préçision)
Declare Sub Sleep Lib "kernel32" (ByVal DureeMS As Long)
Sub Wait2(Duree As Single)
Dim t1 As Single
t1 = Timer + Duree
Do While Timer < t1
DoEvents '<= evite de bloquer le système
Sleep 1& '<= libère le CPU pendant 1 milliseconde (évite de chauffer)
Loop
End Sub
Le Sleep est une bonne idée pour libérer un peu le CPU, mais le problème (comme les contrôles Timer, l'API GetTickCount, et du style) sont de l'ordre des ~50/~15 ms selon le système d'exploitation (9X/NT). Et ça enlève énormément de précision selon la nature du programme (Animation, DirectX, ...).
Une question concernant les chaînes de caractères, les instructions Left$, Mid$, etc... sont-elles différentes des Left, Mid, etc... ?
En tout cas, c'est cool de voir des sources utiles. ;o)
PS : je jurerais que t'étais sur C64 ou Atari vu les I dans les boucles.. :o)
24 janv. 2004 à 18:20
méthode d'optimisation ?
Afyn
(National Association of Vilgenis, Erudits, Dundees And Carrierist )
ou
(Nez Au Vent Et Doigt Au C....
... Au Ciel surement !)
24 janv. 2004 à 14:33
En revanche, c'est plus sensible (parfois bcp+) dans ceci :
avant :
Dim i as long, j as long
for i = 1 to 1000
'code...
for j = 1 to 1000
'code
next j
next i
après :
dim i as long, j as long
i=1
do while i <= 1000
'code...
j=1
do while j <= 1000
'code
j=j+1:loop
i=i+1:loop
En gros c'est avantageux dans les boucles imbriqués, surtout si les "incrementals" (i, j) sont utilisés pour la déclaration des boucles interne (do while j < i ...).
Maintenant tu me diras "on en fait pas tout les jours des boucles imbriqués" ... arf :)
ps : "Navedac" ??
24 janv. 2004 à 11:34
Il y a un leger gain pour DO While
Mais bon c'est pas flagrant
A+
Afyn
24 janv. 2004 à 11:26
'Avant
For i = 1 To 150000
Next i
'Après (vitesse a vérifier en benchmark post-compilatoire : varie selon l'algo)
Dim i As Long
i = 1
Do While i <= 150000
i = i + 1
Loop
' nota : très utile lorsque vous devez imbriquer des boucles.
J'ai pas vraiment trouver de gain !!!
Je dirais même que pour les boucle For Next il y a un leger
avantage (grande boucle).
Donc les amis continuez a utiliser For Next ...
Afyn
Navedac
PS si tu veux je t'envois le petit prog de test par mail.
17 août 2003 à 19:25
Tu indique d'utiliser vbCompareBinary car plus rapide, il faut bien sûr préciser que parfois on a besoin d'une comparaison avec vbCompareText.
Les instructions Close et Reset ne sont pas totalement identiques mais la différence est minime.
Dans les fonctions (ou plutot les commandes) peu utilisées, j'ajouterai :
- l'instruction Mid$() dont la syntaxe est particulière puisqu'elle est celle d'un assignement.
- les fonctions IIf(), Choose(), Switch()
Et pour finir, je conseille un article à tous les développeurs vb qui utilisent les chaines de caractères avec les API (paske c vraiment la merde avec leur unicode à la con ; et ça devient encore pire quand on veut interférer avec un autre langage) : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnw32dev/html/ora_apiprog6_topic1.asp
12 août 2003 à 13:29
Pour le déasm, aha evidemment je t'attendais au tournant :) . En fait, tout dépend comment tu compiles. en faisant un code qui utilise essentiellement les instructions de base, et en supprimant tout les contrôles (opt. avancés) on se débarrase de 3/4 des appels à msvbm60. Un __vbaVarForInit et __vbaVarForNext sera remplaçé par un petit jne ... En fait, il serai judicieux de faire un tutoriel sur le compilateur lui-même...
12 août 2003 à 12:31
end with avec les objects
alors que un autre test sur ce site prouve la lenteur flagrante de ce procéder !!
ps:faudra que tu explique sur quoi tu te base en desassemblant un exe vb parce que à part l'ordre des call tu passe ton temp dans les fonction de msvbrun !
ceci dit bon boulot quand meme hein !
11 août 2003 à 22:06
11 août 2003 à 21:45
Un code clair et simple est plus facile a modifier et à maintenir.
Exemple simple :
'Avant
If b = 27 Then
a = True
Else
a = False
End If
'Après
Dim a As Boolean
a (b 27)
Tu ne gagne rien a procéder de la sorte, tu as juste moins de ligne mais aussi moins de clareté.
L'optimisation d'un code source se fait avec une charte mathematique des opérations mathématique effectué par le processeur afin de gagner des cycles...
C'est plus compliqué que simplement changer toute les itérations par de la récursive afin d'avoir moins de lignes...
Bon travail tout de même !
11 août 2003 à 19:15
n'hésite pas à en remettre, ça m'intéresse fort
11 août 2003 à 17:37
11 août 2003 à 17:33
10/10
11 août 2003 à 17:04
bien que pour la plupart, ils sont très connu, il faudrais presque faire un dossier complet sur les optimisation et ici c'est un bon départ
Nix, on demande une nouvelle section sur ton site lol
11 août 2003 à 16:38
11 août 2003 à 16:37
je suis content de voir que je m'en servais deja de la plupart :D