Statique Vs Instance De Performance De La Méthode C#
J'ai quelques méthodes globales déclarées dans la classe publique dans mon ASP.NET application web.
J'ai l'habitude de déclarer toutes les méthodes globales dans la classe publique dans le format suivant
public static string MethodName(parameters) { }
Je veux savoir comment elle aurait un impact sur les performances de point de vue?
- Lequel est le mieux? Méthode statique ou Non Méthode Statique?
- Raison pourquoi c'est mieux?
http://bytes.com/topic/c-sharp/answers/231701-static-vs-non-static-function-performance#post947244 états:
parce que les méthodes statiques sont à l'aide de verrous pour être Thread-safe. Le toujours
faire en interne un Moniteur.Enter() et le Moniteur.exit() pour s'assurer
Fil de sécurité.
Tout http://dotnetperls.com/static-method états:
méthodes statiques sont normalement plus rapide pour invoquer sur la pile d'appel de
les méthodes d'instance. Il y a plusieurs raisons à cela dans le C#
langage de programmation. Les méthodes d'Instance réellement utiliser le "il"
pointeur d'instance en tant que premier paramètre, donc une méthode d'instance sera
toujours que les frais généraux. Les méthodes d'Instance sont également mis en œuvre avec
le callvirt l'instruction dans la langue intermédiaire, qui impose une
légère surcharge. Veuillez noter que changer vos méthodes statiques
méthodes est peu probable pour aider beaucoup sur des objectifs ambitieux objectifs de performance, mais
il peut aider un tout petit peu et, éventuellement, conduire à de nouvelles réductions.
Je suis un peu confus à utiliser?
- Avez-vous lu à la fin de ce premier lien? Il devient tout à fait clair, même dans le fil, que l'affirmation à propos de verrouillage automatique est faux.
Vous devez vous connecter pour publier un commentaire.
Votre premier lien:
Qui est totalement à l', horriblement, abominablement mal.
Si vous ajoutez
[MethodImpl(MethodImplOptions.Synchronized)]
de la méthode, que l'instruction est en partie vrai.L'ajout de cet attribut sera la cause de la CLR pour envelopper
static
méthodes à l'intérieur delock(typeof(YourClass))
et les méthodes d'instance à l'intérieur delock(this)
.Cela devrait être évitée dans la mesure du possible
Votre deuxième lien est correct.
Les méthodes statiques sont un peu plus vite que les méthodes d'instance, parce qu'ils n'ont pas un
this
paramètre (donc en sautant d'unNullReferenceException
vérifier à partir de la callvirt instruction)J'ai tendance à des soins de très peu de choses sur la performance à cet égard. Quelles méthodes statiques sont vraiment utiles pour l'application de pratiques fonctionnelles. Par exemple, si vous créez une private static helper dans votre instance de la classe, vous avez la tranquillité d'esprit en sachant que cette méthode ne peut pas modifier l'état de l'instance.
Personnellement, je vais toujours choisir l'approche qui est mieux pour achiving votre tâche en cours et à écrire stable, lisible et facile d'entretien code.
Il existe d'autres moyens pour améliorer les performances de votre application.
quelques exemples:
Si vous souhaitez utiliser une méthode simple à plusieurs reprises sans l'instanciation d'un objet à chaque fois (une fonction d'assistance) puis utiliser une méthode statique dans une classe statique.
Si votre méthode accède à d'autres variables dans la classe et n'est pas thread-safe utilisation de la fonction membre.
Dans asp.net si vous souhaitez partager un objet à travers des sessions ou vous pouvez améliorer les performances avec une méthode interne met en cache le résultat d'une méthode statique serait bien, aussi.
Vous pouvez mélanger à la fois des moyens et de l'utilisation de l'usine modèle de conception pour avoir une classe avec certaines fonctions de membre, mais vous assurer qu'il n'y a toujours qu'une seule instance à la fois.
Parfois une fonction statique peut éviter les erreurs stupides ou réduit la nécessité d'une exécution chèques:
Mais dans l'ensemble ça dépend totalement de la tâche en cours. Il n'y a pas de facile "toujours utiliser cette approche..." la réponse à votre question.
C'est un choix de conception. Si vous disposez d'une logique qui comprennent la création de l'instance de la classe et de la mise à jour de certaines propriétés, aller par exemple de la méthode en tant que méthode statique sera partagée entre les instances. Alors si vous avez quelques fonctions utilitaires comme faire quelques manipulation de la chaîne, de la création d'une chaîne de connexion etc.. qui ne fait pas intervenir la manipulation d'objet, d'aller pour la méthode statique.