Sont des méthodes statiques plus efficace?
En termes de mémoire et de temps, est-il préférable de faire une méthode statique?
- Pour répondre à votre question: oui, mais vous ne devriez jamais prendre cela en considération. Voir LBushkin de réponse.
- Complètement reformulé la question. Il sonnait comme vous faisiez référence à l'actuel processus de fabrication d'une méthode statique. 😉 Le Refactoring rendre ce processus plus rapide!
Vous devez vous connecter pour publier un commentaire.
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."
static
inestimable.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érer, est 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
de référence de votre type, peut entraîner 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.
callvirt
dans des cas comme scellé classes, et ainsi de suite. Je ne suis pas sûr à quel point il ne fait cela, mais c'est possible.callvirt
doit être utilisé pour les appels à travers l'assemblée des limites parce que la méthode de préparation du virtuel est un non-modification de rupture (alors que la rendant virtuel->non virtuelle serait). En raison du fait qu'une méthode virtuelle est explicite dans la CLI (par opposition à l'implicite dans la JVM), même dans la non-optimisation de la mode de l'équipe commune d'enquête peuvent déterminer si l'utilisation directe ou indirecte de l'expédition. La seule surcharge est alors la valeur null est à vérifier, qui est tout sauf libre sur des processeurs actuels.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 fortement probable que tout simple des choses comme des propriétés auraient été incorporé de toute façon.Utiliser des objets "naturellement" (
obj.SomeMethod("abc",123);
) - simplifier le code, et profil de trouver des problèmes de performance - il est très peu de chances d'être dans la différence entre l'instance et statique, sauf si vous exécutez certains très boucles serrées. Il y 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 statique si elle ne dépend pas de l'/modifier l'objet.
Méthodes virtuelles (substituables), d'autre part exiger de l'appelant pour vérifier de manière précise la mise en œuvre de l' 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 c'. 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.
La différence est négligeable dans la plupart des cas, mais statique est plus efficace.
Les étapes suivantes sont à éviter dans une méthode statique d'appel:
Je trouve que beaucoup de méthodes de l'utilitaire, j'écris à l'intérieur d'une classe donnée seulement besoin d'un peu de données membres de la classe, ou rien du tout. Dans ces cas, j'ai tendance à écrire ces méthodes (stand-alone) méthodes statiques, en passant directement les quelques éléments de données dont ils ont besoin.
Si elles sont en particulier le général et utiles pour les autres classes, je peux les rendre public.