Conseil d'optimisation (postez vos exemples)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Conseil d'optimisation (postez vos exemples)

Message 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 :

Code : Tout sélectionner

if truc = 1
    truc = 0
elseif truc = 0
    truc  = 1
endif
je fais très souvent ceci :

Code : Tout sélectionner

truc = 1-truc
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))
Dernière modification par blendman le mar. 20/oct./2015 11:35, modifié 3 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Conseil d'optimisation (postez vos exemples)

Message 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

Code : Tout sélectionner

Select truc
Case 1
    truc = 1
Default
    truc  = 0
endselect
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 
Dernière modification par Ar-S le mar. 20/oct./2015 9:14, modifié 1 fois.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Conseil d'optimisation (postez vos exemples)

Message 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

Code : Tout sélectionner

W ;(width) pour la Largeur,  H ;(height) pour hauteur etc...
Exemple si vous voulez coder en Français

Code : Tout sélectionner

L ;pour largeur, H ;pour Hauteur
Le deuxième commentaire est le nom de vos procédures, qui doit être parlant
Exemple si vous voulez coder en anglais

Code : Tout sélectionner

Procedure MakeThis()
Exemple si vous voulez coder en Français

Code : Tout sélectionner

Prodedure FaitCeci()
Pour terminer je choisi un style pour variables et procédures nomade

Code : Tout sélectionner

MaVariable
MaProcedure
ou autre

Code : Tout sélectionner

Ma_Variable
Ma_Procedure
Je différentie mes variable global

Code : Tout sélectionner

gMaVariableGlobal
Je nomme mes liste et map comme ceci

Code : Tout sélectionner

myStructures
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.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Conseil d'optimisation (postez vos exemples)

Message par majikeyric »

blendman a écrit :je fais très souvent ceci :

Code : Tout sélectionner

truc = 1-truc
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.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Conseil d'optimisation (postez vos exemples)

Message 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, ...
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Conseil d'optimisation (postez vos exemples)

Message 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 ^^.
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Conseil d'optimisation (postez vos exemples)

Message 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).
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Conseil d'optimisation (postez vos exemples)

Message 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.
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Conseil d'optimisation (postez vos exemples)

Message 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.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Conseil d'optimisation (postez vos exemples)

Message par djes »

Un bon papier sur pas mal d'optims en assembleur (et en C). http://www.agner.org/optimize/optimizing_assembly.pdf
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Conseil d'optimisation (postez vos exemples)

Message 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 :mrgreen:
Dernière modification par Anonyme2 le mer. 21/oct./2015 18:02, modifié 1 fois.
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Conseil d'optimisation (postez vos exemples)

Message par majikeyric »

Merci pour le doc djes, très intéréssant!
Répondre