"case of " VS "if then"

Résolu
bundyboss Messages postés 28 Date d'inscription mardi 24 juin 2003 Statut Membre Derniè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?
A voir également:

32 réponses

jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
16 févr. 2005 à 12:10
Un if sans hésitation...Pour t'en convaincre fais une boucle et chronomètre à l'aide de GetTickCounter.

j!nH
3
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
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





Donc, je ne suis pas d'accord avec j!nH, na !



Case vainqueur !




Ken@vo

____________________

Code, Code, Codec !





un code pour vérifier ce que je dis :



procedure Rien;

begin

end;



procedure TForm1.Button1Click(Sender: TObject);

var

i: Word;

j, h: longint;

begin

h := GetTickCount;

for j := 0 to 3000000 do

begin

i := SecondOf(Now);

case i of

0: Rien;

1: Rien;

2: Rien;

3: Rien;

4: Rien;

5: Rien;

6: Rien;

7: Rien;

8: Rien;

9: Rien;

10: Rien;

11: Rien;

12: Rien;

13: Rien;

14: Rien;

15: Rien;

16: Rien;

17: Rien;

18: Rien;

19: Rien;

20: Rien;

21: Rien;

22: Rien;

23: Rien;

24: Rien;

25: Rien;

26: Rien;

27: Rien;

28: Rien;

29: Rien;

30: Rien;

31: Rien;

32: Rien;

33: Rien;

34: Rien;

35: Rien;

36: Rien;

37: Rien;

38: Rien;

39: Rien;

40: Rien;

41: Rien;

42: Rien;

43: Rien;

44: Rien;

45: Rien;

46: Rien;

47: Rien;

48: Rien;

49: Rien;

50: Rien;

51: Rien;

52: Rien;

53: Rien;

54: Rien;

55: Rien;

56: Rien;

57: Rien;

58: Rien;

59: Rien;

end;

end;

H := GetTickCount - h;

Button1.Caption := IntToStr(h);

end;



procedure TForm1.Button2Click(Sender: TObject);

var

i: Word;

j, h: longint;

begin

h := GetTickCount;

for j := 0 to 3000000 do

begin

i := SecondOf(Now) mod 20;

if i = 0 then Rien;

if i = 1 then Rien;

if i = 2 then Rien;

if i = 3 then Rien;

if i = 4 then Rien;

if i = 5 then Rien;

if i = 6 then Rien;

if i = 7 then Rien;

if i = 8 then Rien;

if i = 9 then Rien;

if i = 10 then Rien;

if i = 11 then Rien;

if i = 12 then Rien;

if i = 13 then Rien;

if i = 14 then Rien;

if i = 15 then Rien;

if i = 16 then Rien;

if i = 17 then Rien;

if i = 18 then Rien;

if i = 19 then Rien;

if i = 20 then Rien;

if i = 21 then Rien;

if i = 22 then Rien;

if i = 23 then Rien;

if i = 24 then Rien;

if i = 25 then Rien;

if i = 26 then Rien;

if i = 27 then Rien;

if i = 28 then Rien;

if i = 29 then Rien;

if i = 30 then Rien;

if i = 31 then Rien;

if i = 32 then Rien;

if i = 33 then Rien;

if i = 34 then Rien;

if i = 35 then Rien;

if i = 36 then Rien;

if i = 37 then Rien;

if i = 38 then Rien;

if i = 39 then Rien;

if i = 40 then Rien;

if i = 41 then Rien;

if i = 42 then Rien;

if i = 43 then Rien;

if i = 44 then Rien;

if i = 45 then Rien;

if i = 46 then Rien;

if i = 47 then Rien;

if i = 48 then Rien;

if i = 49 then Rien;

if i = 50 then Rien;

if i = 51 then Rien;

if i = 52 then Rien;

if i = 53 then Rien;

if i = 54 then Rien;

if i = 55 then Rien;

if i = 56 then Rien;

if i = 57 then Rien;

if i = 58 then Rien;

if i = 59 then Rien;

end;

H := GetTickCount - h;

Button2.Caption := IntToStr(h);

end;
3
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
16 févr. 2005 à 00:44
Oui, sans conteste, quand on peut utiliser "Case of", c'est plus rapide (et plus élégant).

1 à 0 en faveur de Case of !
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
16 févr. 2005 à 11:46
2 à 0 pour "Case of" !


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Derniè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.

j!nH
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
16 févr. 2005 à 12:01
Mais beaucoup moins lisible et ça prend plus de place dan le code.....


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
0
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
16 févr. 2005 à 12:04
Oui mais là il a bien parlé d'utilisation mémoire et pas de visibilité ;).

j!nH
0
bundyboss Messages postés 28 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 3 mars 2005
16 févr. 2005 à 12:07
c'est exact, un code pas lisible ou peut le cacher...
Non pour un cas de 300 tests qu'est ce qui serai le plus rapide?
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
16 févr. 2005 à 12:10
jinh68 >> ok ok je me tais


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
0
bundyboss Messages postés 28 Date d'inscription mardi 24 juin 2003 Statut Membre Derniè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
0
cs_neko Messages postés 135 Date d'inscription jeudi 14 août 2003 Statut Membre Dernière intervention 12 octobre 2006 1
16 févr. 2005 à 15:03
ça depend de la version a delphi que tu as, a partir de la version 7 ( me semble ) le Case ... Of est optimisé il fait ses comparaisons par dichotomie

bouh
0
bundyboss Messages postés 28 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 3 mars 2005
16 févr. 2005 à 16:17
Je suis sur la 3.0 mais c'est tres interessant a savoir! merci pour l'info
0
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
16 févr. 2005 à 16:24
J'ai vérifié sous D5 , pour une boucle de 3000000 de cycles, le If met environ 20 ms de moins que le Case.

j!nH
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
16 févr. 2005 à 18:18
Ah ! ça fait plaisir !

Vive Case ! lol

Merci Kenavo !


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
0
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
16 févr. 2005 à 18:24
Hum, on va pas s'entendre lol ^^.Deja explique moi pourquoi ds un cas i:= secondOf(Now) et dans l'autre cas i:= secondOf(now) mod 20;

Surtout qu'un modulo est une instruction très lente que tu multiplie par le nombre de passages dans la boucle.

j!nH
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
16 févr. 2005 à 18:36
Même en enlevant mod 20, le if reste plus lent chez moi...


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
0
bundyboss Messages postés 28 Date d'inscription mardi 24 juin 2003 Statut Membre Dernière intervention 3 mars 2005
16 févr. 2005 à 18:43
merci kenavo pour ton explication! c'est kallé mais ca montre bien le fontionnement.
Merci a +
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
16 févr. 2005 à 18:49
...et l'écart entre les deux est chez moi de l'ordre de 530ms (moyenne sur 20 tests).... !!
(Bien sur sans mod 20 ! )


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
0
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Derniè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).

C'est marrant ce petit truc ^^.

j!nH
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
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 !
0
Rejoignez-nous