violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 2010
-
29 avril 2007 à 13:27
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 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 ?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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."
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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.....
[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
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 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.
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 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.