C'est difficile à dire pour sûr, parce que l' .NET compilateur JIT peut être en mesure d'optimiser les frais généraux loin dans certaines (beaucoup?) cas.
Mais si elle n'optimise pas loin, nous sommes fondamentalement parle d'un pointeur supplémentaire d'indirection.
C'est, lorsque vous appelez une non-méthode virtuelle, vous devez
- Enregistrer les registres, de générer la fonction du prologue/épilogue pour configurer les arguments, copiez la valeur de retour et ces.
- sauter à un fixe et statique connue, l'adresse de
1 est le même dans les deux cas. Comme pour les 2, avec une méthode virtuelle, vous devez au lieu de lire à partir d'un fixe décalage dans l'objet de la vtable, puis sauter à chaque fois que les points de. Que fait la branche de prédiction plus difficile, et il peut pousser des données, le cache du PROCESSEUR. Donc, la différence n'est pas énorme, mais elle peut s'accumuler si vous faites chaque appel d'une fonction virtuelle.
Il peut aussi inhiber des optimisations. Le compilateur peut facilement insérer un appel à une nonvirtual fonction, parce qu'il sait exactement quelle fonction est appelée. Avec une fonction virtuelle, qui est un peu plus compliqué. Le JIT-compilateur peut encore être en mesure de le faire, une fois qu'il est déterminé dont la fonction est appelée, mais c'est beaucoup plus de travail.
Dans l'ensemble, il peut encore ajouter, en particulier dans les performances de domaines critiques. Mais ce n'est pas quelque chose que vous avez besoin de s'inquiéter à moins que la fonction est appelée, à tout le moins quelques centaines de milliers de fois par seconde.