![]() |
| Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé. | |||||||
|
|||||||
| Général VBA Forum général VBA . Pour les logiciels spécifiques (Access, Excel, Word, ...), postez dans les bons sous forums. |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Membre Confirmé
![]() Date d'inscription: août 2006
Messages: 226
|
Bonjour,
Un collegue est moi avons voulu tester la difference de rapidité entre un appel par byval et un byref. Nous pensions que le ByRef allait remporter la bataille au la main.. Et ô suprise ! Non ! C'est le ByVal qui a mis moins de temps. Alors nous ne comprenons pas notre résultat. Quelqu'un pourrait il confirmer ou infirmer notre résultat? |
|
|
|
|
|
#2 (permalink) |
|
Inscrit(e)
Date d'inscription: juillet 2007
Localisation: au pays de la liberté d'esprit
Messages: 3 077
|
Bonjour,
Ta question n'en n'est pas une vraie... Et la réponse dépend de ton code ... ByRef(par défaut), passe une valeur par référence Byval (à spécifier) passe la valeur telle qu'elle est au moment du passage. Il y a des cas où ByRef est nécessaire et d'autres ou Byval suiffit (et va alors plus vite, bien évidemment)... Alors : sans ton code, ma foi (et ses commentaires ad hoc) ==>> réponse de Normand !
__________________
Deux points essentiels à mes yeux : 1) Je ne regarde ni n'analyse aucun fichier joint, mais uniquement les portions de code incluses et donc affichées et commentées dans une discussion. 2) j'abandonne carrément (et sans appel) ma participation à une discussion dès lors qu'est posée une seconde question différente de la première (et ce, même si, dans l'esprit du demandeur, la 2ème est "complémentaire" de la 1ère). |
|
|
|
|
|
#3 (permalink) |
![]() |
Bonjour
Cela me fait toujours sourire quand on parle de performances, là ou par ailleurs le code est rarement, voire jamais, optimisé... Mais bon... Je serais curieux de voir la justification de ucfoutu sur le fait que byval soit évidemment plus rapide. Intuitivement, j'aurais dit l'inverse, puisque ByRef pointe vers quelque chose qui existe alors que ByVal crée une copie. De plus, pour ma part, je pense qu'il ne faut pas les différencier sur la performance, mais sur la finalité. Avec ByRef, je donne la possibilité au code qui reçoit le paramètre de modifier la variable d'origine (et donc de retrouver cette modification dans le code appelant à la sortie de la procédure modificatrice, avec toutes les conséquences, utiles ou néfastes, que cela induit), alors qu'avec ByVal, je verrouille la variable d'origine et transfère "seulement" une copie. Pour moi, c'est là l'unique raison d'utiliser l'un plutôt que l'autre, indépendamment de toute "performance" dont la mesure ne peut bien souvent être réalisée, en VBA, que de façon tellement théorique qu'elle en perd toute utilité.
__________________
Pierre Fauconnier -------------------- "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire) Pensez au tag ![]() Mon blog sur DVP - Mes petits papiers sur DVP Je ne peux en aucun cas être tenu pour responsable des conséquences de l'utilisation des codes que je fournis dans le cadre des réponses apportées sur les forums, même s'il s'avérait que ces codes sont erronés ou amènent à des dysfonctionnements, de manière manifeste ou non. |
|
|
|
|
|
#4 (permalink) | |
|
Inscrit(e)
Date d'inscription: juillet 2007
Localisation: au pays de la liberté d'esprit
Messages: 3 077
|
Citation:
Aucun gain de temps réellement significatif sur une seule opération, avec une seule variable. Plusieurs variables passées ByRef dans une fonction appelée en boucle un grand nombre de fois et c'est une toute autre paire de manches ... J'ajoute que l'utilisation de Byref est potentiellement dangereuse, si le développeur est un étourdi. Plusieurs discussions sur le net dénoncent d'ailleurs l'imprudence qu'à commise VB en faisant de ByRef le type de passage par défaut. Pour le reste (la performance du reste des applications très ..moyennes.. dont nous sommes bien souvent les spectacteurs), je suis d'accord avec toi...
__________________
Deux points essentiels à mes yeux : 1) Je ne regarde ni n'analyse aucun fichier joint, mais uniquement les portions de code incluses et donc affichées et commentées dans une discussion. 2) j'abandonne carrément (et sans appel) ma participation à une discussion dès lors qu'est posée une seconde question différente de la première (et ce, même si, dans l'esprit du demandeur, la 2ème est "complémentaire" de la 1ère). |
|
|
|
|
|
|
#5 (permalink) |
![]() |
Sur le fait que ByRef soit par défaut à la place de Byval, je suis d'accord avec toi. Il faudrait que je lise d'autres sources pour me faire une opinion sur le reste de ton explication.
Mais je reste toujours, comme toi semble-t-il, perplexe quant à une véritable optimisation du code grâce à des "trucs" comme celui-là, en tout cas en VBA, voire même en VB6, pour la plupart des "applications" dont on parle sur nos forums. J'ai eu dernièrement une discussion sur ce forum sur le fait de savoir s'il était plus performant d'utiliser Code :
If i = 1 Then ... End If If i = 2 Then ... End If Code :
Select Case i Case 1 ... Case 2 ... End Select Code :
For i = 1 to 1000000000 .Donc, au delà de la taquinerie, cela me fait souvent marrer quand on vient parler de performances...
__________________
Pierre Fauconnier -------------------- "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire) Pensez au tag ![]() Mon blog sur DVP - Mes petits papiers sur DVP Je ne peux en aucun cas être tenu pour responsable des conséquences de l'utilisation des codes que je fournis dans le cadre des réponses apportées sur les forums, même s'il s'avérait que ces codes sont erronés ou amènent à des dysfonctionnements, de manière manifeste ou non. |
|
|
|
|
|
#6 (permalink) |
|
Membre Confirmé
![]() Date d'inscription: août 2006
Messages: 226
|
bonjour,
J'arrive un peu après la bataille... Pour le code de comparaison entre byref et byval, j'ai utilisé une boucle comme celles dont Pierre fait allusion. Je ne savais pas que l'envoie par defaut est byref. Ce qui pourrait expliquer l'origine de nos resultats ( sur une echelle du temps : rien<byval<byref). En tout cas en apprenant ça, je crois que je n'ecrirai plus des: Code :
sub truc(byref var as VarTyp) end sub |
|
|
|
|
|
#7 (permalink) | |
|
Membre émérite
![]() Date d'inscription: février 2005
Localisation: France - Drôme
Messages: 936
|
Bonjour,
Citation:
En effet, en utilisant ces mots-clés tu explicites ton intention quant au passage d'argument et la possibilité/nécessité de les modifier dans la procédure concernée. Cela participe de la "documentation" de ton code (surtout s'il n'y a pas de commentaire) en vue de son partage avec d'autres développeurs, ou même simplement pour t'aider à te rappeler la façon d'appeler ta procédure. Petit témoignage: lors d'appels de procédures/fonctions, j'ai souvent besoin de "remonter" des informations en plus du résultat (retourné dans le cas d'une fonction). Aussi, je "documente" les paramètres concernés dans la procédure avec un suffixe "_out" (genre langage ADA) qui me rappelle que le paramètre est utilisé pour "retourner" une valeur. Exemple: Code :
Public Function FichierExiste(sNomFichier As String, _ Optional ByRef nTailleFichier_out As Long) As Boolean End Function
__________________
Les bons réflexes VB/VBA: __ Option Explicit ___ Toujours compiler le code avant de tester ! (dans l'EDI, menu Débogage, commande Compiler) |
|
|
|
|
![]() |
![]() |
||
Profiling d'un Byref vs Byval
|
||
Offres d'
emploi informatique
sur Lesjeudis.com
|
| Outils de la discussion | |
|
|