Syntaxe d'écriture

Résolu
cuq Messages postés 345 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 21 mars 2008 - 10 août 2006 à 13:05
cs_thephil Messages postés 189 Date d'inscription mercredi 21 août 2002 Statut Membre Dernière intervention 19 janvier 2011 - 11 août 2006 à 12:58
Bonjour,


Y'a t'il une différence entre :


MsgBox "Bonjour"


Call MsgBox("Bonjour")


Dim Retour As Long

Retour = MsgBox("Bonjour")


Dim Ret As VbMsgBoxResult

Ret = MsgBox("Bonjour")


dirrérence mémoire, rapidité ?


merci,

10 réponses

Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007
10 août 2006 à 16:09
Salut, oui il y a des différences mais la principale se situe d'abord au niveau de l'utilisation qu'on en fait.

MsgBox "Bonjour"
et
Call MsgBox("Bonjour")

servent à afficher un message sans attente d'un choix de l'utilsateur. Le Call est facultatif et est rarement utilisé. Reste à savoir la différence en terme de consommation ressources et rapidité entre les 2. Je pense qu'elle est minime.

Dim Retour As Long
Retour = MsgBox("Bonjour")
et
Dim Ret As VbMsgBoxResult
Ret = MsgBox("Bonjour")

Ces syntaxes ne sont pas à proprement parler fausses mais inutiles dans ce cas. On les utilise plutot comme ça :

Dim Retour As Long
Retour = MsgBox("Voulez-vous continuer ?", vbYesNo)
If Retour = vbYes Then ....
et
Dim Ret As VbMsgBoxResult
Ret = MsgBox("Voulez-vous continuer ?", vbYesNo)
If Ret = vbYes Then ...

la différence entre ces 2 syntaxes est que Retour est une variable Long et Ret une énumération des valeurs que peut retourner MsgBox donc, a priori Ret consomme plus de mémoire que Retour (quoiqu'une fois compilé, faut voir). D'un autre côté, si tu aimes bien les facilités de prog, quand tu tapes Ret =, la liste des valeurs possibles apparait et tu n'as plus qu'à choisir. Moi je préfère Dim Retour as Long.
3
cs_thephil Messages postés 189 Date d'inscription mercredi 21 août 2002 Statut Membre Dernière intervention 19 janvier 2011
11 août 2006 à 12:58
en faisant les tests (en enlevant tout autre process qui pourrait retarder : réseau, antivirus ...etc), j'obtiens comme Dolphin Boy.
J'obterais pour la même conclusion.
3
cs_thephil Messages postés 189 Date d'inscription mercredi 21 août 2002 Statut Membre Dernière intervention 19 janvier 2011
10 août 2006 à 14:01
je pense que le meilleur moyen de le savoir est de le mesurer ...
mais à priori je pense déjà que tes dernières solutions sont "plus gourmandes" en mémoire (même si c'est négligeable)car tu te te réserves un espace mémoire en déclarant tes variables pour stocker le retour.
0
cboulas Messages postés 2641 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 8 janvier 2014 16
10 août 2006 à 14:01
Salut,


à ma connaissance il n'y en a aucune, sauf entre Retour et Ret
Car Retour te donne un nombre de type Long
alors que Ret te donne un résultat de la fenêtre : OK, Annule, Yes, No, Etc...



Chris...


Web :
Firstruner
0

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

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
10 août 2006 à 19:40
Salut,


pour moi le Call est totalement inutile ici, en plus c'est plus Long à écrire, et avec des parenthèses en plus ...

mais en exécution, ce sera exactement la même chose (enfin je suppose)


le type VbMsgBoxResult est le même que le Long, la preuve:

Dim Ret As VbMsgBoxResult

MsgBox TypeName(Ret)


Ret = MsgBox("Bonjour")

totalement inutile aussi, le réponse par défaut étant VbOk  ( donc Ret = 1)

Daniel
0
cs_thephil Messages postés 189 Date d'inscription mercredi 21 août 2002 Statut Membre Dernière intervention 19 janvier 2011
11 août 2006 à 08:26
he Cuq, pour ma curiosité personnelle ;-), pourquoi cette question ?
parce qui dit msgbox, dit attente d'une réponse de l'utilisateur en principe, donc pas besoin d'une rapidité de fou.
0
cuq Messages postés 345 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 21 mars 2008 2
11 août 2006 à 09:40
Salut thephil,

Bonne remarque, en réalité j'ai pris msgbox comme exemple pour illustré
ma question et pour faire un exemple simple que tout le monde comprend.
Mais derrière cette question qui est un peu simpliste je voulais
éllargir la question à l'assemble des appels à une fonction. 


En gros si l'on a pas besoin de récupérer la valeur retourné par la
fonction, est que l'on fait appel des milliers de fois à cette fonction
dans une procédure est-il préférable d'écrire la fonction seul sans
l'affectation à une variable, d'utiliser call ou de systématiquement
d'affecter le résultat.


Plusieurs me disent que le call est facultatif, voir totalement inutile
dans ce cas je pose aussi la question pourquoi avoir la fonction call :

Microsoft dit "Une fonction peut également être appelée à l'aide de l'instruction Call. Dans ce cas, la valeur de retour est ignorée."

Que veut dire ignorée ? la valsuer est simplement non prise en compte
ou les mécanisme d'affectation mémoire sont eux aussi ignorés à la
compilation donc avec un gain de temps ?


salutations,
0
cs_thephil Messages postés 189 Date d'inscription mercredi 21 août 2002 Statut Membre Dernière intervention 19 janvier 2011
11 août 2006 à 11:12
Ok, je vois très bien ce que tu veux dire. Pas facile alors de connaitre la réponse sans avoir le source de vb, pour savoir s'il alloue parmis les cas que tu as cité de la mémoire ou non à l'appel d'une fonction.
0
cuq Messages postés 345 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 21 mars 2008 2
11 août 2006 à 11:15
Bon je pense que nous avons tous perdu ....

j'ai fait un petit test avec le code suivant


Private Sub Command1_Click()

Dim T1

Dim T2

Dim I As Long

Dim ret As Double


    ' pour  comparaison de temps

    'test 1

    T1 = Time

    For I = 1 To 900000000

        retourne

    Next I

    T2 = Time

    T1 = T2 - T1

    MsgBox ("temps diff " & Format(T1, "hh:mm:ss"))

   

    'Test 2

    T1 = Time

    For I = 1 To 900000000

        Call retourne

    Next I

    T2 = Time

    T1 = T2 - T1

    MsgBox ("temps diff " & Format(T1, "hh:mm:ss"))

   

    'Test 3

    T1 = Time

    For I = 1 To 900000000

        ret = retourne

    Next I

    T2 = Time

    T1 = T2 - T1

    MsgBox ("temps diff " & Format(T1, "hh:mm:ss"))

   

End Sub


Function retourne() As Double

    retourne = 1

End Function


Pour mesurer la différence de temps entre les trois écritures. Sur mon
PC si je test en mode console j'obtient pour les 3 écritures le même
temps à savoir 2 min 43 s. Mais en mode compilé les résultat sont
différent  2mn33 , 2mn37 et 2mn26 !!!!!!


Donc finalement et contre toute attente c'est  "ret = retourne" qui est le plus rapide.

Si quelqu'un peut me confirmer les résultats et a une explication, je suis preneur..

Salutations,
0
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007
11 août 2006 à 12:46
J'ai fait les mêmes tests chez moi (avec un I max 10x moindre car j'ai un super veau chez moi) et mes résultats sont différents:
En IDE, les 2 premiers tests sont équivalents et le 3ème moins rapide.
En compilé, test1 est le plus rapide et test3 le moins rapide.


Mais je crois que c'est un faux problème car j'ai fait d'autres tests avec une sub à la place de la function et ne renvoyant donc pas de valeur.


test1 et test2 aussi rapides l'un que l'autre mais plus rapide qu'avec ta function.
test3 impossible.


Conclusion, il faut utiliser la syntaxe correspondant à l'utilisation :


test1 et test2 pour des sub ou function ne retournant pas de valeur.
test3 pour les function retournant une valeur.
0
Rejoignez-nous