Page 1 sur 1

optimisation enchainement de IF Vs Select

Publié : lun. 06/juin/2011 12:55
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 )

Re: optimisation enchainement de IF Vs Select

Publié : lun. 06/juin/2011 13:38
par flaith
Mes résultats :
---------------------------
Time:
---------------------------
14329 pour le select
14593 pour le if
---------------------------
:mrgreen:

Re: optimisation enchainement de IF Vs Select

Publié : lun. 06/juin/2011 14:10
par Backup
sur mon nc10
54265/55391 :lol:

Re: optimisation enchainement de IF Vs Select

Publié : lun. 06/juin/2011 14:39
par Ar-S
J'ai pas noté (17xxx 17xxx) mais if perd ici aussi :)

Re: optimisation enchainement de IF Vs Select

Publié : lun. 06/juin/2011 16:31
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 ?

Re: optimisation enchainement de IF Vs Select

Publié : lun. 06/juin/2011 16:37
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

Re: optimisation enchainement de IF Vs Select

Publié : lun. 06/juin/2011 17:18
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

Re: optimisation enchainement de IF Vs Select

Publié : lun. 06/juin/2011 17:53
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:

Re: optimisation enchainement de IF Vs Select

Publié : lun. 06/juin/2011 18:28
par Le Soldat Inconnu
13478 / 13588

En toute logique, le code ASM généré doit être pratiquement identique

Re: optimisation enchainement de IF Vs Select

Publié : lun. 06/juin/2011 19:55
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.

@++

Re: optimisation enchainement de IF Vs Select

Publié : lun. 06/juin/2011 20:03
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

Re: optimisation enchainement de IF Vs Select

Publié : lun. 06/juin/2011 22:39
par gildev
Oula, presque identiques:
30 373
30 763

Je suis étonné, j'ai toujours cru que la différence était beaucoup plus importante.

Re: optimisation enchainement de IF Vs Select

Publié : mar. 07/juin/2011 4:53
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:

Re: optimisation enchainement de IF Vs Select

Publié : mar. 07/juin/2011 6:34
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.

Re: optimisation enchainement de IF Vs Select

Publié : mar. 07/juin/2011 6:50
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.