bundyboss
Messages postés28Date d'inscriptionmardi 24 juin 2003StatutMembreDernière intervention 3 mars 2005
-
15 févr. 2005 à 23:57
aafi -
3 mars 2005 à 20:16
Salut,
j'aimerai savoir quel traitment est le plus rapide et le moins gournamd en memoire pour faire des actions du genre
case Valeur of
0: i:=1
1: i:=2
.. : i:=..
. : i:=..
300 : i:=3
end;
et
if i:=0 then
i:=1:
if i:=1 then
i:=2;
.....
if i:=300 then
i:=3;
Dans un cas comme ca, mis a part la visibilité il vaut mieux utiliser un case non?
cs_Kenavo
Messages postés702Date d'inscriptionvendredi 21 mars 2003StatutMembreDernière intervention 1 octobre 20095 16 févr. 2005 à 18:11
Tiens ben moi, c'est exactement le contraire, 200ms plus rapide pour le case
(alors là je dis 200ms pour bien montrer que c'est mieux
que 20ms, mais si je ne dis pas sur combien... ! ni sur quelle machine
!)
En fait j'ai pas de réponse correcte mesurée : je n'ai essayé que sur des case ou if sur 60 valeurs (0 à 59). Mais une chose parait sûre, plus il y a de valeurs, et plus le Case prendra l'avantage, du fait de sa façon de travailler .
EXECUTION :
A la compilation d'un case, une table des adresses des parties spécifiques à chaque
valeur est remplie, et le case execute une suite d'instruction du type :
cmp eax,max
jnbe suite {si la valeur est supérieure à la plus grande des valeurs du
case }
jmp dword ptr[eax * 4 + AdresseDebutTable]
et pi c'est tout !
A la compilation d'un if, on a un code du genre
cmp bx,#valeur
jnz plusloin
{instructions}
cmp bx,#valeursuivante
jnz plusloinencore
{autres instructions}
.... etc ....
.... etc ....
.... etc ....
Ce qui est sûr, c'est que toutes les comparaisons sont effectuées, et donc plus il y en a, plus le boulot est long !
MEMOIRE : (puisque c'est aussi évoqué dans la question initiale)
case : 4 instructions (20 octets environ) + table 4 octets x indice max du case
pour case de 0 à 300 : 20 + 4 x 301 = 1224 octets
if : un compare (4 octets) et un saut (2 octets au mieux) par comparaison
pour un if avec nos valeurs de 0 à 300 : 6 x 301 = 1806 octets
jinh68
Messages postés215Date d'inscriptionmardi 29 juillet 2003StatutMembreDernière intervention 1 septembre 2006 16 févr. 2005 à 11:56
Bonjour,
Je ne suis pas d'accord, un case prend plus d'instructions mémoire car il teste quand même tous les cas en interne..Cela dépend bien sur des cas, mais à la base une imbrication de if..else est plus rapide.
bundyboss
Messages postés28Date d'inscriptionmardi 24 juin 2003StatutMembreDernière intervention 3 mars 2005 16 févr. 2005 à 12:21
d'apres ni69, il vaut mieux te croire.... .
Je ferai sans doute prochainement un test meme si je ne connais pas GetTickCounter.. va falloir chercher encore lol..
Si j'y arrive et que j'ai le tps je posterai la reponse.
Encore merci a vous tous.
"case of" =2
"if Then" =1 et remporte, qui a dit que la majorité gagne tjs
jinh68
Messages postés215Date d'inscriptionmardi 29 juillet 2003StatutMembreDernière intervention 1 septembre 2006 16 févr. 2005 à 18:52
Hum attendez, attendez , je suis en train de comprendre pourquoi...Laissez moi un petit moment et je vous explique cet écart aberrant (qui ne s'explique pas par le calcul de Kenavo).
ni69
Messages postés1418Date d'inscriptionsamedi 12 juin 2004StatutMembreDernière intervention 5 juillet 201012 16 févr. 2005 à 18:56
Mmmh....
L'écart se réduit considérablement quand on met "else if" à la place des if de 2 à 59...
C'est vraiment une bonne question que tu as posée là bundyboss Va-t-on vraiment finir pas trouver la solution ?
@+
Bonne Prog'
Nico
<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !