Je mets à jour mon générateur de code et j'ai le choix entre l'implémentation d'un stub de méthode en tant que méthode virtuelle dans une classe de base ou une méthode partielle dans le code généré. Y a-t-il une différence de performance entre les deux?Quelle est la différence de performance entre une méthode partielle et la substitution d'une méthode virtuelle dans une classe de base?
Répondre
Si vous mettre en œuvre la méthode partielle, alors je m'attendrais à ce qu'il n'y ait pas de différence notable. C# utilise toujours callvirt
pour appeler les méthodes d'instance, même si elles ne sont pas virtuelles, il n'y aura donc pas beaucoup de changement.
Si vous ne pas implémenter la méthode partielle, l'appel lui-même est retiré - donc il n'y a jamais une pile pour préparer, etc. Ce sera infintessimally plus rapide, ce qui est pourquoi il est très bien pour le code généré pour inclure un nombre ridicule de stubs de méthode partielle: si vous ne les utilisez pas, ils n'existent pas.
La plus grande raison d'utiliser des méthodes partielles est simplement de ne pas avoir à sous-classer l'objet. Vous ne pouvez pas déclarer les parties "abstract"/"virtual" et "override" d'une méthode virtuelle dans la même classe (même partielle). Les méthodes partielles résout ce problème, et le problème des points d'extensibilité de la publicité (sans avoir à utiliser la réflexion). Très bon pour les outils de génération de code ;-
Il peut y avoir une différence mineure, mais elle devrait être négligeable sauf si la méthode est appelée de façon répétée dans une boucle.
Les méthodes partielles ne sont que du sucre syntaxique permettant la division d'une classe entre plusieurs fichiers.
Lorsqu'ils sont compilés, ils sont exactement les mêmes que si toutes les méthodes avaient été dans le fichier. En d'autres termes, le seul 'ralentissement' que vous êtes susceptible de voir avec une méthode partielle est le temps de compilation légèrement plus long :)
EDIT: Et comme la réponse ci-dessous le dit, ils ne sont même pas là s'ils peuvent ' t être trouvé lors de la compilation.