2009-12-14 16 views
3

Quel est le problème de performance avec la méthode statique par rapport aux méthodes non statiques? J'ai lu que les méthodes statiques sont meilleures en termes de performance mais je veux savoir, comment elles sont plus rapides? Si une méthode n'utilise aucun membre d'instance, notre compilateur doit en prendre soin et la traiter comme une méthode statique.Méthodes statiques en C#?

Répondre

7

Edit: Eric commentaires plus sur ce here, et des conseils qu'il y sont des moments où call est ... bien qu'il faille noter que son new() exemple isn't guaranteed ;-P


Dans le compilateur d'origine (pré-1.1), le compilateur a traité comme des méthodes d'instance non-virtuelles (sans this) comme étant statiques; le problème est que cela a conduit à des problèmes bizarres avec null vérification, à savoir

obj.SomeMethod(); 

n'a pas a lancé une exception (pour obj=null et méthode non virtuelle SomeMethod qui ne touche this). Ce qui était mauvais si vous avez déjà changé l'implémentation de SomeMethod. Lorsqu'ils ont étudié le coût de l'ajout de la vérification nulle explicite (c.-à-d. Null-check puis static-call), il s'est avéré que c'était exactement la même chose que d'utiliser un appel virtuel, ce qui le rend beaucoup plus souple. prévisible.

Notez que le "ne pas jeter une exception" est aussi entièrement le comportement si SomeMethod est une méthode d'extension (statique).

Je pense qu'à un moment donné, vous pourriez émettre IL pour invoquer une méthode d'instance régulière via static-call, mais la dernière fois que j'ai essayé, j'ai eu le "oh non vous ne!" message du CLR (cette opération peut déstabiliser le runtime); soit ils ont complètement bloqué cela, soit (peut-être plus probablement) j'ai fait un usage spécial de l'IL.

+0

J'ai lu que le compilateur C++ fait cela, alors pourquoi n'ont-ils pas rendu le compilateur C# aussi intelligent? – viky

+0

Il ne s'agit pas de smart ... comme je l'ai expliqué, il n'y avait pas de différence notable entre faire un "appel nul et statique" vs "appel virtuel" (qui a un contrôle nul intégré). Alors pourquoi avoir deux options différentes à maintenir? –

3

Voir this question.

est ici l'extrait:

un appel statique est 4 à 5 fois plus rapide que la construction une instance à chaque fois que vous appelez une méthode d'instance. Cependant, nous sommes toujours parler que de dizaines de nanosecondes par appel

+2

Notez que cela se compare à la construction d'une nouvelle instance pour chaque appel; il ne compare pas le cas le plus habituel de construction d'une instance une seule fois, pour plusieurs appels. –

+3

Si vous faites simplement référence aux réponses d'une autre question, pourquoi ne pas simplement poster le lien en commentaire ou voter en double? –

+1

Notez également que cet article était en 2003. Le CLR a beaucoup changé depuis lors. –

1

Je doute que le compilateur traitera comme une méthode statique, mais vous pouvez vérifier vous-même. L'avantage serait pas de création de l'instance. Pas de garbage collector à s'inquiéter. Et seulement le constructeur statique à appeler, s'il y en a un.

+0

Le compilateur C++ fait cela, pourquoi pas compilateur .Net (C#) – viky

0

méthodes statiques rapides, car la construction d'une instance

acheter si vous créez seulement une instance et d'enregistrer membre statique, la performance est égale

ils sont très faibles dans la performance totale

so ... ....

5

Oui, un appel statique serait plus rapide - vous n'avez pas besoin de créer une instance de l'objet avant d'appeler la méthode. (Bien que vous ne remarquerez évidemment pas la différence)

En pratique, cela n'a pas d'importance si le compilateur optimise une méthode (rend la méthode d'instance statique) - vous n'appelez pas la méthode d'instance sauf si vous avez déjà créé l'instance déjà, non? À la fin de la journée, vous devriez plutôt essayer d'optimiser votre code pour la maintenabilité plutôt que d'essayer d'économiser 3 nanosecondes ici ou là.

+0

Je souhaite que notre compilateur C# soit assez intelligent pour faire cette optimisation tout comme le compilateur C++. Merci d'expliquer !! – viky

0

yes la méthode statique est rapide mais la mémoire acquise par la variable statique n'est pas contrôlée par GC et n'est pas libérée même si elle n'est pas nécessaire, donc c'est un problème.

mais plus que tout, vous devriez considérer la conception de l'allpication car la mémoire et la vitesse ont augmenté de jours mais votre conception peut craindre si vous n'utilisez pas correctement les variables statiques.

+0

Vous n'avez pas besoin d'une variable statique pour appeler une méthode statique. Ce sont des concepts différents. –

Questions connexes