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
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.
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
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. –
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? –
Notez également que cet article était en 2003. Le CLR a beaucoup changé depuis lors. –
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.
Le compilateur C++ fait cela, pourquoi pas compilateur .Net (C#) – viky
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 ... ....
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à.
Je souhaite que notre compilateur C# soit assez intelligent pour faire cette optimisation tout comme le compilateur C++. Merci d'expliquer !! – viky
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.
Vous n'avez pas besoin d'une variable statique pour appeler une méthode statique. Ce sont des concepts différents. –
- 1. C++ Singleton Vs méthodes statiques
- 2. méthodes abstraites statiques dans C++
- 3. Méthodes statiques et méthodes d'instance en mémoire
- 4. variables statiques dans les méthodes Objective-C
- 5. nécessitant la présence de méthodes statiques en C#
- 6. Architecture en couches et méthodes statiques
- 7. F # Méthodes statiques multilignes
- 8. F # Méthodes statiques privées
- 9. Méthodes statiques dans ASP.NET
- 10. méthodes statiques/champs et WCF
- 11. Constantes statiques en C#
- 12. Mocking Méthodes statiques utilisant Rhino.Mocks
- 13. MVVM ViewModel et méthodes statiques
- 14. simples méthodes statiques (console) aider
- 15. Unité dans les méthodes statiques
- 16. méthodes statiques et tests unitaires
- 17. PHP: méthodes statiques abstraites polymorphes
- 18. Accès méthodes statiques sur une classe générique dans C#
- 19. Transformation de méthodes C# en méthodes C++
- 20. Blocs synchronisés pour les méthodes statiques et non statiques
- 21. Génériques dans les méthodes d'usine statiques? (Java)
- 22. Méthodes statiques ou non? Variables globales?
- 23. Utilisation de méthodes statiques ou de méthodes statiques dans la classe Dao?
- 24. Génériques Java + méthodes d'usine statiques = [panique]
- 25. variables de membre mutables statiques en C++?
- 26. Méthodes de simulation utilisées dans les méthodes statiques
- 27. Variables statiques en C et C++
- 28. PHP 5.2 Méthodes statiques virtuels comme
- 29. Comment éviter l'erreur 'call is ambiguous ...' lors de l'écriture de méthodes statiques et non statiques en C#?
- 30. F # Méthodes statiques Dans la classe
J'ai lu que le compilateur C++ fait cela, alors pourquoi n'ont-ils pas rendu le compilateur C# aussi intelligent? – viky
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? –