En termes de mémoire et de temps, est-il préférable de rendre une méthode statique?
Réponses
Trop de publicités?Oui, généralement, il n'est pas nécessaire de passer de la "ce" de référence. Cette référence est passée dans le registre ECX, donc il n'y a plus d'espace de pile nécessaire. Le registre est déjà défini si vous faites l'appel d'une méthode d'instance de la même classe, il n'y aura pas d'économies. Mais il peut aider à soulager la pression sur un PROCESSEUR x86 à base lorsque la méthode est dans une autre classe, x86 n'ont pas beaucoup de registres. Voir mesurables d'amélioration de la perf serait extrêmement rare.
Je ne religieusement la marque les méthodes d'une classe qui n'utilisent pas les membres de l'instance statique. J'ai de la valeur inhérente d'un contrat octroyé par le mot-clé static: "cette méthode n'est pas la mutation de l'état de l'objet."
Vous devriez faire une méthode statique si elle ne nécessite pas de toutes les informations d'état de la classe dont il fait partie.
Si vous n'avez pas de soins sur le polymorphisme, vous pouvez écrire quelque méthode que ce soit d'instance ou statique par juste de se décider à prendre les membres de l'instance de la classe et de les transmettre à la méthode en tant qu'arguments. Ce que vous devriez considérerest de savoir si la syntaxe est naturel, si le code est facile à comprendre et utile, et ainsi de suite.
Vous ne devriez pas vous soucier de l'optimisation à ce niveau, parce que la charge de travail d'une instance contre la méthode statique est négligeable. Oui, il y a de l'espace utilisé dans l'envoi de la table pour le type (si la méthode est virtuelle) - mais c'est une minuscule, frais généraux constants. Oui, il y a aussi une petite surcharge lors de l'invocation d'une méthode d'instance par rapport à une méthode statique - mais encore une fois, il est minuscule.
Cela semble être un niveau de micro-optimisation, sauf si vous avez mesurables, des preuves tangibles de croire qu'elle peut affecter réellement le rendement du programme, vous devriez éviter. En fait, si tu fais les choses mal, le coût de passage de paramètres supplémentaires (copie sur la pile, etc) plutôt que d'y accéder par le biais de l'caché this
référence de votre type, peut entraîner la pire performance.
Vous êtes mieux de l'analyse de la sémantique de la méthode, et de faire de la statique/instance de décision sur cette base.
Si vous allez passer dans l'instance de toute façon (SomeStaticMethod(obj, "abc", 123);
), alors vraiment pas. Vous ne pouvait utilement utiliser une méthode statique dans un scénario sans polymorphisme, et dans de tels cas, il est hautement probable que les simples choses comme les propriétés auraient été incorporé de toute façon.
Utiliser des objets "naturellement" (obj.SomeMethod("abc",123);
) - simplifier le code, et de profil pour trouver des problèmes de performance - il est très peu probable d'être dans la différence entre l'instance et statique, sauf si vous utilisez certains de très boucles serrées. Il sont certains scénarios où il pourrait la matière, mais ils sont assez spécialisés.
Il y a peu de différence entre une méthode statique et non virtuel méthode d'instance. Ce dernier a juste l' this
prointer/référence comme "caché" de l'argument. Dans le code machine généré, les deux types d'appels sont très similaires.
Une méthode doit être statique si elle ne dépend pas de l'/modifier l'objet.
Des méthodes virtuelles (substituables), d'autre part exiger de l'appelant pour vérifier de manière précise la mise en œuvre dits de la vtable. En plus d'empêcher le compilateur de l'in-lining très petites méthodes (simple accesseurs de propriété sont inline très souvent) la recherche ne prend que quelques cycles.
Encore, les méthodes virtuelles sont le plus rapide type de répartition dynamique disponible en C#/sur le CLR. Beaucoup plus rapide que les délégués et de réflexion.
Il y a beaucoup de questions de ce genre. Sont des méthodes statiques vite/ - vite? Sont des fonctions virtuelles vite/ - vite? Est i++ plus vite ou plus lentement que ++i? Est for(;;) plus vite ou plus lentement que while(true)?
Il est utile de se tenir de certains logiciels et tuning il. Qui vous donnera une bonne idée du genre de choses qui influent sur les performances du logiciel, dans la pratique.
Ensuite, vous verrez que la réponse à des questions comme c'est (la plupart du temps) qu'il est insignifiant.
Si je peux généraliser, les choses qui logiciel lent, dans mon expérience, sont l'utilisation de lignes de code qui semblent innocents, mais dont le temps de la consommation peut être des ordres de grandeur de plus que ce que l'on pourrait l'imaginer. Depuis qu'ils sont innocents, ils ne peuvent pas toujours être trouvé en regardant le code. Exemples: à plusieurs Reprises l'allocation, l'initialisation, et en libérant de grandes structures de données juste pour s'assurer qu'ils existent. L'internationalisation des chaînes qui n'ont pas besoin de l'être. Notification de style de programmation qui peut transformer un simple paramètre d'une propriété dans une gigantesque cascade d'appels de méthode au sein d'une grande structure de données. Simple O(n^2) les opérations qui n'auraient jamais été un problème, sauf que le n obtenu grand. Pensant que (a < b) prend environ le même laps de temps si a et b sont des entiers ou des grandes classes. Ce "temps de multiplication par la recherche innocent" a un effet composé en plusieurs niveaux d'abstraction, si grand logiciel a tendance à être rongée, dans mon expérience.