TUTORIEL OPTIMISATIONS AVANCÉES

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 11 août 2003 à 16:37
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Derniè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.

https://codes-sources.commentcamarche.net/source/8198-tutoriel-optimisations-avancees

crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
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és 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 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és 171 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 20 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és 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
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és 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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és 88 Date d'inscription jeudi 26 décembre 2002 Statut Membre Derniè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és 171 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 20 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és 278 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 27 avril 2006 1
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és 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 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és 23 Date d'inscription vendredi 14 mars 2003 Statut Membre Dernière intervention 14 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és 365 Date d'inscription vendredi 24 mai 2002 Statut Membre Dernière intervention 18 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és 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 décembre 2016
2 févr. 2004 à 08:53
-> un peu jeune pour Prog sur ATARI !!!

/|

Vive ATARI

Afyn
cs_Drakkhen Messages postés 23 Date d'inscription vendredi 14 mars 2003 Statut Membre Dernière intervention 14 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.


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)
Afyn Messages postés 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 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és 248 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 19 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és 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 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és 608 Date d'inscription samedi 3 août 2002 Statut Membre Dernière intervention 22 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és 365 Date d'inscription vendredi 24 mai 2002 Statut Membre Dernière intervention 18 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és 248 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 19 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és 186 Date d'inscription mercredi 11 avril 2001 Statut Membre Dernière intervention 12 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és 248 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 19 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és 171 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 20 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és 224 Date d'inscription samedi 26 juillet 2003 Statut Membre Dernière intervention 30 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és 340 Date d'inscription vendredi 11 octobre 2002 Statut Membre Dernière intervention 14 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és 340 Date d'inscription vendredi 11 octobre 2002 Statut Membre Dernière intervention 14 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és 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
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és 235 Date d'inscription mercredi 4 avril 2001 Statut Membre Dernière intervention 9 novembre 2007
11 août 2003 à 16:38
sur le cul... j'en connaissais mais alors là.... merci :)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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
Rejoignez-nous