"case of " VS "if then" [Résolu]

bundyboss 33 Messages postés mardi 24 juin 2003Date d'inscription 3 mars 2005 Dernière intervention - 15 févr. 2005 à 23:57 - Dernière réponse :  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?
Afficher la suite 

Votre réponse

34 réponses

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

j!nH

Merci jinh68 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de jinh68
Meilleure réponse
cs_Kenavo 759 Messages postés vendredi 21 mars 2003Date d'inscription 1 octobre 2009 Dernière intervention - 16 févr. 2005 à 18:11
3
Merci
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;

Merci cs_Kenavo 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de cs_Kenavo
Meilleure réponse
japee 1799 Messages postés vendredi 27 décembre 2002Date d'inscription 19 juillet 2018 Dernière intervention - 17 févr. 2005 à 19:25
3
Merci
Bon, décidément, j'ai des problèmes avec la nouvelle interface.



COMPARER LES INSTRUCTIONS CASE OF, IF THEN ET IF THEN ELSE

http://www.delphifr.com/code.aspx?ID=29593



à +, japee

Merci japee 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de japee
japee 1799 Messages postés vendredi 27 décembre 2002Date d'inscription 19 juillet 2018 Dernière intervention - 16 févr. 2005 à 00:44
0
Merci
Oui, sans conteste, quand on peut utiliser "Case of", c'est plus rapide (et plus élégant).

1 à 0 en faveur de Case of !
Commenter la réponse de japee
ni69 1529 Messages postés samedi 12 juin 2004Date d'inscription 5 juillet 2010 Dernière intervention - 16 févr. 2005 à 11:46
0
Merci
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 !
Commenter la réponse de ni69
jinh68 215 Messages postés mardi 29 juillet 2003Date d'inscription 1 septembre 2006 Dernière intervention - 16 févr. 2005 à 11:56
0
Merci
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
Commenter la réponse de jinh68
ni69 1529 Messages postés samedi 12 juin 2004Date d'inscription 5 juillet 2010 Dernière intervention - 16 févr. 2005 à 12:01
0
Merci
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 !
Commenter la réponse de ni69
jinh68 215 Messages postés mardi 29 juillet 2003Date d'inscription 1 septembre 2006 Dernière intervention - 16 févr. 2005 à 12:04
0
Merci
Oui mais là il a bien parlé d'utilisation mémoire et pas de visibilité ;).

j!nH
Commenter la réponse de jinh68
bundyboss 33 Messages postés mardi 24 juin 2003Date d'inscription 3 mars 2005 Dernière intervention - 16 févr. 2005 à 12:07
0
Merci
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?
Commenter la réponse de bundyboss
ni69 1529 Messages postés samedi 12 juin 2004Date d'inscription 5 juillet 2010 Dernière intervention - 16 févr. 2005 à 12:10
0
Merci
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 !
Commenter la réponse de ni69
bundyboss 33 Messages postés mardi 24 juin 2003Date d'inscription 3 mars 2005 Dernière intervention - 16 févr. 2005 à 12:21
0
Merci
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
Commenter la réponse de bundyboss
cs_neko 135 Messages postés jeudi 14 août 2003Date d'inscription 12 octobre 2006 Dernière intervention - 16 févr. 2005 à 15:03
0
Merci
ç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
Commenter la réponse de cs_neko
bundyboss 33 Messages postés mardi 24 juin 2003Date d'inscription 3 mars 2005 Dernière intervention - 16 févr. 2005 à 16:17
0
Merci
Je suis sur la 3.0 mais c'est tres interessant a savoir! merci pour l'info
Commenter la réponse de bundyboss
jinh68 215 Messages postés mardi 29 juillet 2003Date d'inscription 1 septembre 2006 Dernière intervention - 16 févr. 2005 à 16:24
0
Merci
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
Commenter la réponse de jinh68
ni69 1529 Messages postés samedi 12 juin 2004Date d'inscription 5 juillet 2010 Dernière intervention - 16 févr. 2005 à 18:18
0
Merci
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 !
Commenter la réponse de ni69
jinh68 215 Messages postés mardi 29 juillet 2003Date d'inscription 1 septembre 2006 Dernière intervention - 16 févr. 2005 à 18:24
0
Merci
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
Commenter la réponse de jinh68
ni69 1529 Messages postés samedi 12 juin 2004Date d'inscription 5 juillet 2010 Dernière intervention - 16 févr. 2005 à 18:36
0
Merci
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 !
Commenter la réponse de ni69
bundyboss 33 Messages postés mardi 24 juin 2003Date d'inscription 3 mars 2005 Dernière intervention - 16 févr. 2005 à 18:43
0
Merci
merci kenavo pour ton explication! c'est kallé mais ca montre bien le fontionnement.
Merci a +
Commenter la réponse de bundyboss
ni69 1529 Messages postés samedi 12 juin 2004Date d'inscription 5 juillet 2010 Dernière intervention - 16 févr. 2005 à 18:49
0
Merci
...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 !
Commenter la réponse de ni69
jinh68 215 Messages postés mardi 29 juillet 2003Date d'inscription 1 septembre 2006 Dernière intervention - 16 févr. 2005 à 18:52
0
Merci
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
Commenter la réponse de jinh68

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.