Si vous transmettez un type de référence, ByRef est plus lent.
C'est parce que ce qui est transmis est un pointeur sur un pointeur. Tout accès aux champs de l'objet nécessite le déréférencement d'un pointeur supplémentaire, ce qui prendra quelques cycles d'horloge supplémentaires.
Si vous transmettez un type de valeur, alors byref peut être plus rapide si la structure a de nombreux membres, car il ne transmet qu'un seul pointeur plutôt que de copier les valeurs sur la pile. En termes d'accès aux membres, byref sera plus lent car il doit effectuer une déréférence de pointeur supplémentaire (sp->pValueType->member vs sp->member).
La plupart du temps, en VB, vous ne devriez pas avoir à vous soucier de cela.
Dans .NET, il est rare d'avoir des types de valeurs avec un grand nombre de membres. Ils sont généralement de petite taille. Dans ce cas, la transmission d'un type de valeur n'est pas différente de la transmission de plusieurs arguments à une procédure. Par exemple, si vous aviez un code qui transmettait un objet Point par valeur, sa perforation serait la même que celle d'une méthode qui prendrait les valeurs X et Y comme paramètres. Voir DoSomething(x as integer, y as integer) ne poserait probablement aucun problème de performance. En fait, vous n'y réfléchiriez probablement pas à deux fois.
Si vous définissez vous-même de grands types de valeurs, vous devriez probablement envisager de les transformer en types de référence.
La seule autre différence est l'augmentation du nombre d'indirections de pointeurs nécessaires pour exécuter le code. Il est rare que vous ayez besoin d'optimiser à ce niveau. La plupart du temps, il y a soit des problèmes algorithmiques que vous pouvez résoudre, soit votre goulot d'étranglement est lié aux entrées-sorties, comme l'attente d'une base de données ou l'écriture dans un fichier, auquel cas l'élimination des pointeurs indirects ne vous aidera pas beaucoup.
Ainsi, au lieu de vous concentrer sur la question de savoir si byval ou byref est plus rapide, je vous recommande de vous concentrer sur ce qui vous donne la sémantique dont vous avez besoin. En général, c'est une bonne idée d'utiliser byval, sauf si vous avez spécifiquement besoin de byref. Cela rend le programme beaucoup plus facile à comprendre.