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

Messages postés
28
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
3 mars 2005
- - 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 

20/32 réponses

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

j!nH

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 221 internautes nous ont dit merci ce mois-ci

Commenter la réponse de jinh68
Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
1
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;

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 221 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Kenavo
Messages postés
1711
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
19 novembre 2019
1
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
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
8
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
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006
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
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
8
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
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006
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
Messages postés
28
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
3 mars 2005
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
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
8
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
Messages postés
28
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
3 mars 2005
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
Messages postés
135
Date d'inscription
jeudi 14 août 2003
Statut
Membre
Dernière intervention
12 octobre 2006
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
Messages postés
28
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
3 mars 2005
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
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006
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
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
8
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
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006
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
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
8
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
Messages postés
28
Date d'inscription
mardi 24 juin 2003
Statut
Membre
Dernière intervention
3 mars 2005
0
Merci
merci kenavo pour ton explication! c'est kallé mais ca montre bien le fontionnement.
Merci a +
Commenter la réponse de bundyboss
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
8
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
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006
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
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
8
0
Merci
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 !
Commenter la réponse de ni69