63 votes

Quelles sont les implications sur les performances des méthodes de marquage / propriétés que le virtuel?

La Question est, comme indiqué dans le titre: Quelles sont les implications sur les performances des méthodes de marquage / propriétés que le virtuel?

- Je suis en supposant que les méthodes virtuelles va pas être surchargée dans la plupart des cas; je vais souvent travailler avec la classe de base ici.

139voto

dsimcha Points 32831

Fonctions virtuelles ont seulement une très petite surcharge de performance par rapport à des appels directs. À un niveau faible, vous êtes essentiellement en regardant un tableau de recherche pour obtenir un pointeur de fonction, puis un appel à l'aide d'un pointeur de fonction. Les Processeurs modernes peut même prédire indirecte des appels de fonction raisonnablement bien dans leur branche, les prédicteurs, donc ils ne vont généralement pas de mal moderne CPU pipelines trop mal. Au niveau de l'assemblage, un appel de fonction virtuelle se traduit par quelque chose comme ce qui suit, où l' I est arbitraire de la valeur immédiate.

MOV EAX, [EBP + I] ; Move pointer to class instance into register
MOV EBX, [EAX] ;  Move vtbl pointer into register.
CALL [EBX + I]  ;   Call function

Vs. à la suite d'un appel de la fonction:

CALL I  ;  Call function directly

Le réel des frais généraux vient que les fonctions virtuelles peuvent pas être intégrées, pour la plupart. (Ils peuvent être dans JIT langues si la VM se rend compte qu'ils sont toujours à la même adresse, de toute façon.) En plus de l'accélération que vous obtenez à partir d'inlining lui-même), d'inlining permet à plusieurs autres optimisations telles que la réduction des constantes, parce que l'appelant peut savoir comment le destinataire de l'appel à l'interne. Pour les fonctions qui sont assez grosses pour ne pas être incorporé en tout cas, les performances devraient être négligeables. Pour les très petites fonctions qui pourraient être inline, c'est quand vous avez besoin d'être prudent afin de fonctions virtuelles.

Edit: une Autre chose à garder à l'esprit que tous les programmes exigent le contrôle de flux, et ce n'est jamais gratuit. Ce qui permettrait de remplacer votre fonction virtuelle? Une instruction switch? Une série d'instructions if? Ce sont toujours les branches qui peuvent être imprévisibles. En outre, étant donné un N-chemin de la branche, une série d'instructions if trouverez le bon chemin d'accès en O(N), tandis qu'une fonction virtuelle trouverez en O(1). L'instruction switch peut être O(N) ou O(1) selon qu'il est optimisé pour un saut de la table.

16voto

Jon Limjap Points 46429

Rico Mariani expose les enjeux concernant la performance de sa Performance de Tidbits blog, où il a déclaré:

Méthodes virtuelles: Êtes-vous à l'aide de méthodes virtuelles lors des appels directs le ferait? Beaucoup de fois les gens vont avec méthodes virtuelles pour permettre de futurs l'extensibilité. L'extensibilité est un bonne chose, mais il ne viennent à un prix – assurez-vous que votre plein extensibilité l'histoire est travaillé et que votre utilisation de fonctions virtuelles qui se passe réellement pour vous rendre là où vous devez être. Par exemple, parfois, les gens pensent à travers le site d'appel des questions, mais ensuite ne considérez pas la façon dont le "extended" les objets vont être créées. Plus tard, ils se rendent compte que les (plus de) la fonctions virtuelles n'aide pas du tout et ils ont besoin d'un tout autre modèle pour obtenir la "prolongation" des objets dans le système.

D'étanchéité: l'Étanchéité peut être un moyen de limiter le polymorphisme de votre classe de seulement ces sites où le polymorphisme est nécessaire. Si vous contrôler entièrement le type d'étanchéité peut être une bonne chose pour la performance car elle permet de diriger les appels et inline.

Fondamentalement, l'argument à l'encontre des méthodes virtuelles, c'est qu'il n'autorise pas le code pour être un candidat de l'in-lining, par opposition à des appels directs.

Dans l'article MSDN Améliorer .NET Application de Performances et d'Évolutivité, c'est expliqué davantage:

Considérer les avantages et les inconvénients des Membres Virtuels

Utiliser virtual membres à fournir de l'extensibilité. Si vous n'avez pas besoin de prolonger votre classe conception, évitez les membres virtuels parce qu'elles sont plus chères à l'appel en raison d'une quasi la lecture de la table et ils échec à certains moment de l'exécution de l'optimisation des performances. Par exemple, les membres virtuels ne peuvent pas être intégrées par le compilateur. En outre, lorsque vous permettre de sous-typage, vous présentent en fait très complexe et les contrats pour les consommateurs et vous finissent inévitablement avec le versioning des problèmes lorsque vous tentez de mettre à niveau votre classe dans l'avenir.

Une critique de ce qui précède, cependant, provient de la TDD/BDD camp (qui veut méthodes par défaut virtuel) arguant que l'impact sur les performances est négligeable, de toute façon, surtout que nous avons accès à beaucoup plus rapide des machines.

11voto

abelenky Points 28063

Généralement une méthode virtuelle va tout simplement à travers une table de fonction-pointeurs pour atteindre la méthode actuelle. Cela signifie un supplément de déréférencement et un rond-voyage de la mémoire.

Alors que le coût n'est pas absolument ZÉRO, il est extrêmement minime. Si elle contribue à votre programme à tous d'avoir des fonctions virtuelles, par tous les moyens, de le faire.

Son beaucoup mieux d'avoir un programme bien conçu avec un tout petit, minuscule, minuscule performances plutôt qu'un maladroit programme juste pour le plaisir d'éviter la v-table.

4voto

jalf Points 142628

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

  1. Enregistrer les registres, de générer la fonction du prologue/épilogue pour configurer les arguments, copiez la valeur de retour et ces.
  2. 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.

3voto

Crashworks Points 22920

J'ai couru ce test en C++. Un appel de fonction virtuelle prend (sur un 3 ghz PowerPC) entre 7-20 nanosecondes plus qu'un appel de fonction. Cela signifie qu'il est vraiment seulement pour les fonctions en vous prévoyez sur l'appel d'un million de fois par seconde, ou pour des fonctions qui sont si petits que la surcharge peut être plus grande que la fonction elle-même. (Par exemple, en faisant fonctions d'accesseur virtuel de l'aveugle habitude, c'est sans doute imprudent.)

Je n'ai pas couru mon test en C#, mais je pense que la différence sera encore moins il y, depuis près de chaque opération dans le CLR implique indirect, de toute façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X