Page 1 sur 1
Conseil d'optimisation (postez vos exemples)
Publié : mar. 20/oct./2015 8:32
par blendman
Vous pouvez poster ici vos conseils d'optimisation, en précisant :
- optimisation : vitesse d'exécution
- optimisation : longueur du code
Vous pouvez poster de la manière suivante :
- un code simple
- une explication
- une comparaison éventuelle pour qu'on comprenne l'intérêt (si le code et l'explication ne suffisent pas ^^) et si possible un petit code permettant de comparer si c'est plus rapide (dans le cadre d'optimisation lié à la vitesse d'exécution).
N'hésitez pas à poster vos propres optimisations.
Comparaison multiple
Des variables peuvent changer, mais on les connaît à l'avance (pas leur valeur, juste le nom), par contre, pour les tester, on connait les valeurs de test.
- Optimisation : vitesse du code.
Au lieu de faire ça :
Code : Tout sélectionner
if a = 1 and b = 0 and c = 0
Elseif a = 0 and b = 3 and c = 17
Elseif a = -1 and b = 54 and c = 898
Endif
Il m'arrive de faire ceci (on peut utiliser un select/case si on préfère):
Code : Tout sélectionner
If a = 1
If b = 0
If c = 0
EndIf
EndIf
ElseIf a = 0
If b = 3
If c = 17
EndIf
EndIf
ElseIf a = -1
If b = 54
If c = 898
EndIf
EndIf
EndIf
Changer la valeur d'une variable(booléen)
Ce code peut servir pour les interfaces, pour tester un gadget checkbox par exemple, ou pour vérifier si une option est activé.
- optimisation : Code plus court (pas forcément plus rapide)
Au lieu de faire ça :
je fais très souvent ceci :
EDIT :
Autre astuce
Si vous avez le choix entre vérifier une variable numérique ou string, il vaut mieux préférer la variable numérique.
Il semble que vérifier la valeur d'une variable soit plus rapide si celle-ci n'est pas un string.
Code : Tout sélectionner
max = 10000000
tps = ElapsedMilliseconds()
i =0
Repeat
If truc=1
EndIf
i+1
;Delay(1)
Until i >= max
tpsfinal = ElapsedMilliseconds() - tps
tps2 = ElapsedMilliseconds()
i =0
Repeat
If truc$="1"
EndIf
i+1
;Delay(1)
Until i >= max
tpsfinal2 = ElapsedMilliseconds() - tps2
MessageRequester("",Str(tpsfinal))
MessageRequester("",Str(tpsfinal2))
Re: Conseil d'optimisation (postez vos exemples)
Publié : mar. 20/oct./2015 8:50
par Ar-S
Dans ton deuxième exemple tu imposes une opération (la soustraction). Je me dis qu'imposer un chiffre non calculé doit être un micro poil plus rapide. Tout comme utiliser un select au lieu des if
En pratique
Code : Tout sélectionner
Repeat
Select truc
Case 1
truc = 0
Default
truc = 1
EndSelect
Debug "change truc " + Str(truc)
Delay (1000)
compte+1
Until compte = 3
Coté amélioration de la lisibilité (pas forcément de l'efficacité), j'aime de plus en plus les macros.
en reprenant le même exemple
Code : Tout sélectionner
Macro _SelCase(val1,reaction1,val2,reaction2)
Select truc
Case val1
truc = reaction1
Case val2
truc = reaction2
EndSelect
EndMacro
Repeat
_SelCase(1,0,0,1)
Debug "change truc " + Str(truc)
Delay (1000)
compte+1
Until compte = 3
Re: Conseil d'optimisation (postez vos exemples)
Publié : mar. 20/oct./2015 9:01
par microdevweb
Je penses blendman que chacun a sa manière de coder et son style. Moi par exemple dans le cas de sélections multiple je préfère un Select que un if, surtout que l'on peut placé dans case plusieurs valeurs séparées par une virgule ou même placer une valeur 1 to 10 (ce qui par exemple prendra les valeur de 1 à 10)
Pour les booléens (flag) que j'utilise pas mal, ne n'utilise pas de valeurs numérique mais les constante #True ou #False qui sont plus parlante.
En général je préfère passé mais valeur par des variables ou constantes, cela est plus parlant et surtout si cette valeur est utilisée à plusieurs endroits il me suffira de changer la valeur de ma constante ou variable.
Pour résumé un code bien fait, devait être compréhensible même sans commentaire. Car le premier commentaire est le nom de vos variables qui doit être parlant. A vous de définir votre propre charte de développement.
Exemple si vous voulez coder en anglais
Exemple si vous voulez coder en Français
Le deuxième commentaire est le nom de vos procédures, qui doit être parlant
Exemple si vous voulez coder en anglais
Exemple si vous voulez coder en Français
Pour terminer je choisi un style pour variables et procédures nomade
ou autre
Je différentie mes variable global
Je nomme mes liste et map comme ceci
etc...
C'est mas façon de faire, mais peu importe votre style temps qu'il soit efficace et lisible (en premier par vous)
Noter que dans le cas d'un travail en équipe, on a pas le choix. C'est le chef de projet qui défini la charte de programmation et vous devez vous y tenir.
Re: Conseil d'optimisation (postez vos exemples)
Publié : mar. 20/oct./2015 9:28
par majikeyric
blendman a écrit :je fais très souvent ceci :
Il n'y aura pas plus rapide que : truc!1
Il faut savoir ce qu'on entend par optimisation,
optimisation d'écriture, factorisation ou de vitesse d'exécution ?
si c'est en vitesse d'exécution il faut obligatoirement regarder le code ASM généré par PB pour savoir de quoi on parle.
Re: Conseil d'optimisation (postez vos exemples)
Publié : mar. 20/oct./2015 10:36
par djes
Complètement d'accord avec majikeyric! Le terme optimisation est très clair pour les programmeurs chevronnés : il s'agit d'améliorer la vitesse d'exécution d'une portion de code. Dans les exemples que je vois, c'est tout le contraire, il s'agit d'amélioration de la longueur du code, au détriment de la vitesse.
Pour vérifier qu'on parle bien d'optimisation, il faut d'abord établir une démarche de vérification de la vitesse : une méthode de calcul, les règles de compilation à respecter (pas de débogueur, compilation en x64 ou x86, la plateforme, etc.), la méthode de récupération du résultat, ...
Re: Conseil d'optimisation (postez vos exemples)
Publié : mar. 20/oct./2015 11:27
par blendman
@djes : oui, ce n'est pas uniquement l'optimisation en tant que vitesse d'exécution, c'est aussi l'optimisation en tant que réduction du code.
L'objectif de ce sujet est de poster des techniques ou des petits bouts de codes permettant de gagner en vitesse d'exécution ou de grappiller quelques lignes de codes (avec des macros par exemple) afin d'avoir un code plus "simple" (même si parfois, on perd un peu en exécution, le tout, en restant si possible compréhensible, faut pas faire du purepunch non plus ^^).
On peut d'ailleurs le préciser dans son message. J'ai crée ce sujet pour qu'on partage les techniques ou les astuces qui permettent d'améliorer la vitesse d'exécution ou l'optimisation (nombre de lignes) du code. Parce que je cherche souvent des conseils d'optimisation dans les deux domaines et ce serait bien de tout regrouper sur un seul sujet.
Est-ce que ce code pour vérifier vous semble correct ?
Code : Tout sélectionner
max = 10000000
; note : si vous utilisez le delay(1), passez max à 200.
tps = ElapsedMilliseconds()
i =0
Repeat
; le code à vérifier ici
i+1
; Delay(1)
Until i >= max
tpsfinal = ElapsedMilliseconds() - tps
MessageRequester("",str(tpsfinal))
Concernant les codes, chez moi (en utilisant le code juste au-dessus), ce n'est pas du tout concluant, une fois le code truc=1-truc
est plus rapide que select/case et que if/else, mais sur d'autres tests les résultats sont différents, c'est assez aléatoire ^^.
Re: Conseil d'optimisation (postez vos exemples)
Publié : mar. 20/oct./2015 12:06
par majikeyric
Il n'y a pas de secret, il faut faire générer à PB le code ASM et compter le nombre de cycles total pris par chaque structure ( truc-1, select/case , if/else...).
Là tu sauras vraiment ce qui est le plus rapide.
Sinon quand j'ai besoin de "profiler" mon code des fois j'utilise purefiler :
http://www.purebasic.fr/english/viewtop ... 27&t=43727
Attention ne fonctionne pas (pour le moment) pour un exe compilé en Unicode (ASCII only).
Re: Conseil d'optimisation (postez vos exemples)
Publié : mar. 20/oct./2015 14:03
par djes
Non, compter les cycles n'est pas suffisant, principalement parce que les processeurs disposent de caches plus ou moins grands et qu'il faut prendre en compte les accès mémoire, plus ou moins lents selon les catégories de mémoire. Il faut aussi prendre en compte l'aspect multitâches de nos OS. Bref, ce n'est pas si simple.
Re: Conseil d'optimisation (postez vos exemples)
Publié : mar. 20/oct./2015 16:35
par microdevweb
Dans le genre de projets que je réalise actuellement grappiller quelques micro-secondes, ne me serait pas vraiment utilise. Pb est déjà très rapide et la plus part des machines sur le marché le sont aussi. Réduire le code, oui mais à condition que cela reste lisible. La ré-utilisabilité du code, la ça devient intéressant, ce qui a déjà été fait n'est plus à faire et comme la partie du code réutilisée à déjà été débugé moins de risque de bug. C'est la raison pour la quel je fais mon RAD, je sais que je vais passé beaucoup de temps dessus, mais je sais également que je vais en gagné énormément pour mes futures applications de gestion. Ce genre de principe est applicable pour d'autre projet ainsi j'avais commencé une suite de modules pour gérer l'animation, le déplacement et la gravité de personnages pour des jeux 2d.
Re: Conseil d'optimisation (postez vos exemples)
Publié : mer. 21/oct./2015 15:59
par djes
Un bon papier sur pas mal d'optims en assembleur (et en C).
http://www.agner.org/optimize/optimizing_assembly.pdf
Re: Conseil d'optimisation (postez vos exemples)
Publié : mer. 21/oct./2015 17:43
par Anonyme2
Je partage assez l'avis de microdevweb.
La maintenabilité du code c'est le plus important.
L'optimisation du code pour la vitesse ne se justifie pas souvent.
Les jeux etc. nécessitent une optimisation sur les graphismes etc.
Ensuite le code asm, c'est assez ardu avec les pipes, les instructions qui se suivent avec le même registre ralentissent le µp.
@djes :
tu aurais pu nous optimiser le lien que tu nous donnes, c'est-à-dire nous traduire les 164 pages

Re: Conseil d'optimisation (postez vos exemples)
Publié : mer. 21/oct./2015 17:49
par majikeyric
Merci pour le doc djes, très intéréssant!