Instruction Call utile ou pas ?

Résolu
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 29 avril 2007 à 13:27
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 - 30 avril 2007 à 00:07
Violent Ken
Salut à tous ^^

Je suis en phase "d'optimisation" d'un projet, c'est à dire que je reprend chaque ligne de code et je l'améliore, tant d'un point de vue esthétique que d'un point de vue rapidité d'exécution.

J'ai pris l'habitude de mettre Call devant chaque appel à une sub/function ne demandant pas de résultat.

Exemple : je fais

   Call Unload(Me)
   
plutôt que :

   Unload Me, ----
By Renfield
J'ai toujours cru que ce n'était que purement esthétique, mais je viens de me rendre compte que l'exécutable compilé était différent si l'on mettait ou non Call.
Donc ce n'est pas équivalent, le code ASM associé aux 2 méthodes (avec ou sans Call) doit être différent (je suppose), donc ma question est : Call augmente t-il la vitesse d'éxecution ou pas ?

@+ et merci d'avance pour les réponses

Hex Editor VB

10 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
29 avril 2007 à 13:41
Je ne connais pas les différences qu'il peut y avoir entre l'utilisation ou non de Call sur le code et les performances.

Normalement, l'instruction Call est totalement inutile dans l'appel des procédures et fonctions. Il est même de bon ton de la considérer comme obsolete, c'est notamment la poklitique de bon nombres de logiciels "analiseurs" et "optimiseurs" de code.

Cependant, personellement je l'utilise aussi pour des raisons d'estétisme quand j'y pense. Notamment lorsque je dois revenir sur un code plusieurs mois après.
Je trouve plus lisible un
Call MyFctn(toto, titi, tata, tutu)
que un
MyFctn toto, titi, tata, tutu

Mais c'est que des fois, je l'a met, des fois je la met pas, et ce dans le même code, c'est suivant l'humeur.

Cependant, que tu appele directement une sub ou une fonction, une place mémoire est normalement réservée pour la valeur de retour (même pour la sub qui normalement ne retourne rien, c'est pas bien grave, souvent la place mémoire dans ce cas est un registre du proco). L'utilisation de l'instruction Call, qui indique entre-autre explicitement que toute valeur de retour sera irrémédiablement perdu, modifie-t-elle la procédure d'appel ?????

Si un expert passe par là........

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
29 avril 2007 à 14:20
Bonjour;

Aucune différence, sauf dans l'utilisation de la syntaxe. .

"You are not required to use the Call keyword when calling a procedure. However, if you use the Call keyword to call a procedure that requires arguments, argumentlist must be enclosed in parentheses. If you omit the Call keyword, you also must omit the parentheses around argumentlist. If you use either Call syntax to call any intrinsic or user-defined function, the function's return value is discarded.
To pass a whole array to a procedure, use the array name followed by empty parentheses."
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
29 avril 2007 à 16:30
Re salut;

Pour le Me, c'est un peu différent.
Je vais essayer de m'expliquer...

L'utilisation du Me est par exemple très intéressante pour l'appel d'une procédure externe à la form du genre
public sub toto(f as form)
   f.width = 1235
Ens Sub

Car alors il suffit d'écrire

toto me

au lieu de s'empêtrer avec une autre expression de la "chose"

Je suppose que VB n'a pas voulu, de son côté (et puisque la chose était déjà faite) écrire ce Me lors de la compilation dans le cas susvisé et compiler sans ce Me (lorsque présent) dans les cas où ce Me (superflu mais non gênant) n'était pas nécessaire. Il lui aura coûté moins cher en développement de le laisser systématiquement, lorsque présent inutilement.....
3
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
29 avril 2007 à 17:55
Salut,
"pourquoi le fichier compilé est différent"

le fichier compilé est de toute façon différent à chaque compil même sans avoir rien modifié

Daniel
3

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

Posez votre question
Profil bloqué
29 avril 2007 à 21:36
[javascript:alink_4.Click() procédure] de
<object id= "alink_5" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>[javascript:alink_5.Click() bibliothèque de liaisons dynamiques
(DLL)].



Syntaxe


[Call] name [argumentlist]


La syntaxe de l'instruction Call comprend les éléments suivants :


Élément,
Description,

----

Call,
Facultatif.
<object id ="alink_6" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>Mot clé. S'il est indiqué, vous devez
placer argumentlist entre parenthèses. Exemple :
Call
MaProc(0)
,

----

,
Call MyProc(0)
,

----

name,
Nom de la procédure à appeler.,

----

argumentlist,
Facultatif. Liste, délimitée par des virgules, de
<object id="alink_7" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>variables,
<object id="alink_8" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>tableaux ou
<object id="alink_9" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>expressions à passer à la procédure. La
liste argumentlist peut contenir les mots clés ByVal ou
ByRef pour décrire comment les
<object id="alink_10" type="application/x-oleobject" classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11"></object>arguments sont traités par la procédure
appelée. Toutefois, ByVal et ByRef peuvent uniquement être
utilisés dans une instruction Call lors de l'appel d'une procédure DLL.




Remarques


Il n'est pas obligatoire d'employer le mot clé Call pour appeler une
procédure. Toutefois, si vous utilisez ce mot clé dans le cadre de l'appel d'une
procédure nécessitant des arguments, l'élément argumentlist doit être
placé entre parenthèses. Dans le cas d'une procédure appelée sans le mot clé
Call, vous ne devez pas encadrer argumentlist par des parenthèses.
Quelle que soit la syntaxe adoptée pour appeler une fonction intrinsèque ou
définie par l'utilisateur, la valeur renvoyée par la fonction est perdue.


Pour passer un tableau entier à une procédure, entrez le nom du tableau,
suivi de parenthèses vides.

Voilà ce que dit l'aide de  Visual Basic
On retrouve un cas similaire avec l'instruction  Let  qui , lui aussi, est optionnel

GRENIER Alain[8D]
3
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
29 avril 2007 à 13:47
Violent Ken
Salut,
 
je ne savais pas que les "optimiseurs" de code enlevaient les Call... Serais-ce par gain de place (code plus "léger") ou par gain de performances ?

Et effectivement je suis de ton avis, c'est bien plus esthétique de faire Call MyFctn(toto, titi, tata, tutu) .

Esperons qu'un expert passe sur ce topic pour trancher sur la question des performances !

@+

Hex Editor VB
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
29 avril 2007 à 14:23
Violent Ken
C'est effectivement ce que je croyais, mais pourtant il y a bien une différence au niveau du fichier compilé : celui ci est différent avec ou sans le Call.

@+

Hex Editor VB
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
29 avril 2007 à 14:41
Violent Ken
Dans le même genre : il est plus rapide de faire :

Me.Command1.Caption="hure"

ou bien

Command1.Caption="hure"

sachant qu'encore une fois, le code compilé est différent ?
@+

Hex Editor VB
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
29 avril 2007 à 15:25
Violent Ken
Après quelques test, il s'avèrerais que ce soit strictement équivalent en terme de vitesse. De même pour Me.Command1 vs Command1.

Reste à savoir pourquoi le fichier compilé est différent...
@+

Hex Editor VB
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
30 avril 2007 à 00:07
Violent Ken
Gobillot ==> En effet !
Donc a priori, le compilateur ne tient pas compte de cette instruction, tout comme pour Let. Et pour le Me.Command1, je pense aussi que le compilateur doit "enlever" le Me inutile lors de la compilation.

Bon à savoir ^^
Merci à tous, @+

Hex Editor VB
0
Rejoignez-nous