cs_Kenavo
Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
5
17 févr. 2005 à 09:24
'scuse pour mod 20, j!nH,
pas fait exprès ! Mea culpa, mea culpa, mea maxima culpa ! J'avais commencé avec 20 valeurs !
Le mieux est de sortir de la boucle l'instruction i:=SecondOf(Now) (elle est longue) on observe mieux le comportement des routines de test.
Et je te cite:
"De plus comme les valeurs sont consécutives, dans le case, le saut à effectuer est fixe (multiple de 4octets)."
1 - La question de Bundyboss était bien dans ce sens !
2 - Si tu enlèves quelques valeurs, l'adresse de la routine inexistante
est remplacée (dans la table) par l'adresse de l'instruction suivant le
case, donc même temps d'éxécution, mais l'occupation mémoire ne diminue pas !
j!nH,
"De toute facon on ne peut pas vraiment tout expliquer, en raison de l'optimisation effectué par le compilateur Delphi."
Ca, c'est ben vrai !
En
remplaçant une suite de nombre consécutifs par quelques valeurs très
éloignées, il remplace la table par une comparaison après soustraction
(delphi 7), et il pert la structure systématique, que je décrivais plus
haut.
j!nH,
La présence de ou exclusif ne
m'étonne pas, c'est la méthode que j'utilise dans tous les assembleurs
pour coder un case of. Mais là je ne l'ai pas vue (Delphi 7). Elle est
utilisée comme suit :
mov ax,valeur
xor ax,premierevaleur
jz premiereroutine
xor ax,(premierevaleur xor deuxiemevaleur)
jz deuxiemeroutine
xor ax,(deuxiemevaleur xor troisiemevaleur)
jz
troisieme
routine
... etc ...
rappels : A xor A 0 ; (A xor B) xor (B xor C) A xor C
Nico,
"L'écart se réduit considérablement quand on met "else if" à la place des if de 2 à 59... "
Ca, c'est pas faux, mais, tu devrais regarder la pendule de ton ordi en même temps, comme le if
regarde la valeur des secondes (dans mon exemple), si tu es dans le
début de la minute, ta comparaison est vraie assez tôt et tu quitte
rapidement, si tu es dans la fin de la minute .... c'est plus long !
Mais si on doit conclure, et pour répondre à la question (valeurs
consécutives de 0 à 300), il semblerait que l'efficacité et sutout
l'élégance nous amènent à préférer Case.
Gardons pour if d'autres avantages incontestables comme le test de variables string ou le test de valeurs supérieures à $FFFF (limite du case).
Et puis, il ne s'agit que de quelques nano-secondes d'écart sur un PC d'aujourd'hui !
Ken@vo
____________________
Code, Code, Codec !