optimisation enchainement de IF Vs Select

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

optimisation enchainement de IF Vs Select

Message par Thyphoon »

ça fait longtemps que je me demande si il vaut mieux mettre un select ou bien un enchainement de IF/ELSEIF côté performance j'ai donc pondu un petit code pour tester
et bien chez moi c'est le select qui gagne de peu ! :P
avec Pb 4.60b3 x86
23906ms pour le select
24563ms pour le IF

et chez vous ?

Code : Tout sélectionner

DisableDebugger
#MaxB=9000000
a.d=0
time=0
Symbol.s="aa|bb|cc|dd|ee|ff|gg|hh"
time=ElapsedMilliseconds()
For n=1 To #MaxB
For z=1 To CountString(Symbol,"|")+1
    cmd.s=StringField(Symbol,z,"|")
  Select cmd
    Case "aa":
      a+1
    Case "bb":
      a+1
    Case "cc":
      a+1
    Case "dd":
      a+1
    Case "ee":
      a+1
    Case "ff":
      a+1
    Case "gg":
      a+1
    Case "hh":
      a+1
  EndSelect
Next
Next
finala=ElapsedMilliseconds()-time

a.d=0
time=ElapsedMilliseconds()
For n=1 To #MaxB
For z=1 To CountString(Symbol,"|")+1
    cmd.s=StringField(Symbol,z,"|")
    If cmd="aa"
      a+1
    ElseIf cmd="bb"
      a+1
    ElseIf cmd="cc"
      a+1
    ElseIf cmd="dd"
      a+1
    ElseIf cmd="ee"
      a+1
    ElseIf cmd="ff"
      a+1
    ElseIf cmd="gg"
      a+1
  ElseIf cmd="hh"
    a+1
  EndIf
Next
Next 
finalb=ElapsedMilliseconds()-time
MessageRequester("Time:",Str(finala)+" "+Str(finalb),#PB_MessageRequester_Ok )
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: optimisation enchainement de IF Vs Select

Message par flaith »

Mes résultats :
---------------------------
Time:
---------------------------
14329 pour le select
14593 pour le if
---------------------------
:mrgreen:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: optimisation enchainement de IF Vs Select

Message par Backup »

sur mon nc10
54265/55391 :lol:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: optimisation enchainement de IF Vs Select

Message par Ar-S »

J'ai pas noté (17xxx 17xxx) mais if perd ici aussi :)
~~~~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
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: optimisation enchainement de IF Vs Select

Message par Thyphoon »

chez moi sur Pb 4.60b3 x64 (avant c'était sur ma machine au boulot)
c'est l'inverse :?
select : 14633ms
If : 12995ms
pas sur qu'on puisse tirer une conclusion avec mon code ... qu'en pensez vous ?
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: optimisation enchainement de IF Vs Select

Message par case »

personellement je pense que cela dépend des cas a traiter, si c'est un choix sur une seule valeur alors oui select/case est préférable mais sur des conditions multiples if/endif l'emporte..

if a=2 and b=3 and c=4
blabla
endif

avec select/case c'est un poil plus compliqué

select a
case 2
select b
case 3
select c
case 4
blabla
endselect
endselect
endselect
ImageImage
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Re: optimisation enchainement de IF Vs Select

Message par Chris »

C'est surtout une question d'habitude, selon moi.

Parce que de toute façon, on ne trouve quasiment jamais un nombre suffisant de If ou de Select dans un programme pour que que ça se ressente sur le temps d'exécution (sauf dans les programmes de certains gorets que je ne nommerai pas :mrgreen: ).
Les tests représentent souvent, pour ne pas dire toujours, une part négligeable de la totalité du code
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: optimisation enchainement de IF Vs Select

Message par Thyphoon »

Effectivement ! j'essaye d'optimiser mon code d’interprétation de script, et je cherche un peu partout ou je peux faire des optimisations :P
Et comme je me posais la questions entre un select et les if lors de longue liste de test enchainé, j'ai testé avec ce code.
maintenant je suis d'accord avec vous l’écart n'est pas concluant, mais maintenant je le sais ! :mrgreen:
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: optimisation enchainement de IF Vs Select

Message par Le Soldat Inconnu »

13478 / 13588

En toute logique, le code ASM généré doit être pratiquement identique
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: optimisation enchainement de IF Vs Select

Message par G-Rom »

40ms de différence entre les deux. c'est pas significatif.
j'essaye d'optimiser mon code d’interprétation de script, et je cherche un peu partout ou je peux faire des optimisations
L'écriture d'un compilo me prends énormément de temps, le code que j'utilise en PB peut être utilisé pour faire un interpréteur puissant , néanmoins , cela reste un code assez complexe à comprendre.
Grosso modo , voici comment je découpe le code :
Admettons ce code ci :
MaVariable.i = 55
MonResultat.i = MaVariable * 2


via un "nettoyeur" je supprimes les espaces superflu ( chr(32) & chr(9) )
ensuite , je commence à formé des jetons (token en anglais) , chaque jeton possède une expression. le jeton est structuré de manière à connaitre la ligne ou le mot est écrit ainsi que le fichier parent ( pratique pour afficher des erreurs )
le code est décomposé de cette manière :
MaVariable.i
=
55
<EOI>
MonResultat.i
=
MaVariable
*
2
<EOI>

<EOI> désigne la fin d'une instruction , ensuite je commence une analyse lexicale , je détermine le type de chaque jetons
via des regex , ou des procédures qui me sont utiles à cette tache
Par exemple , le premier jeton , on constate que l'on déclare une variable , grâce à une table des variables , je regarde ci celle ci est déjà déclaré , si oui & avec un autre type , je colle une erreur , sinon je valide le jeton et je passe au suivant...
en sortie , j'obtiens un code lexical de ce type :
INIT_VAR|0
EQUAL
55
EOI
INIT_VAR|1
EQUAL
VAR|0
OPMUL
2
EOI
'INIT_VAR|0' désigne que j'initialise une variable qui est présente dans la table à l'index 0
EQUAL est un operateur
etc...

Ensuite je passe le code lexical à l'analyseur syntaxique , c'est lui qui me dira si il y a des erreurs de syntaxes.
si je passe à mon analyseur ( qui est une machine à état ) le jeton suivant : 'INIT_VAR|xx' , le prochain jeton attendu
dois être l'opérateur d'affectation '=' , sinon il y a une erreur de syntaxe.
une fois toute les étapes passé tu n'a plus qu'a executé ton code sans te soucier de l'analyse , puisque c'est fait en amont via les analyseurs.

un jeton peut être représenté ainsi :

Code : Tout sélectionner

structure jeton
 CodeOriginal.s
 LexicalCode.s
 Line.i
 File.s
endstructure
si cela t’intéresse , je te fournirais du code pur & dur.

@++
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: optimisation enchainement de IF Vs Select

Message par Thyphoon »

merci G-Rom du code pourquoi pas, ça peut être intéressant ! :) si tu veux voir ce que j'ai déjà fait j'ai créer un sujet dessus => http://www.purebasic.fr/french/viewtopi ... =6&t=11936
Avatar de l’utilisateur
gildev
Messages : 380
Inscription : mar. 19/juin/2007 10:28
Localisation : Picardie (France)

Re: optimisation enchainement de IF Vs Select

Message par gildev »

Oula, presque identiques:
30 373
30 763

Je suis étonné, j'ai toujours cru que la différence était beaucoup plus importante.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: optimisation enchainement de IF Vs Select

Message par Thyphoon »

gildev a écrit :Oula, presque identiques:
30 373
30 763

Je suis étonné, j'ai toujours cru que la différence était beaucoup plus importante.
oui moi aussi ..d'ou l’intérêt de ce genre de test :mrgreen:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: optimisation enchainement de IF Vs Select

Message par Anonyme2 »

La question avait été abordé sur le forum FR mais je ne retrouve pas, peut être sur un des anciens forums.

Je me souviens que Fred avait répondu que le select était plus rapide car on utilisait la pile et ça allait plus vite. Le code asm n'est donc pas le même.

Mais depuis, le select a évolué avec To, alors il se peut que ça change un peu la donne.
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: optimisation enchainement de IF Vs Select

Message par Thyphoon »

Denis a écrit :La question avait été abordé sur le forum FR mais je ne retrouve pas, peut être sur un des anciens forums.
il me semblait aussi avoir vu quelques choses dessus, mais je n'ai pas retrouvé. Surement sur le tout premier forum
Denis a écrit :, le select a évolué avec To, alors il se peut que ça change un peu la donne.
Oui c'est ce qui m'avais poussé aussi a faire le test c'est le "case" peut absorber plusieurs paramètre et donc je suppose que le code doit être un peu plus complexe.
Répondre