J'ai lu sur la technologie Stackexchange (par exemple, Cet article sur la performance de la Highparavailability.com ), et ont remarqué qu'ils mentionnent une utilisation intensive de méthodes statiques pour une meilleure performance. P>
Pourquoi les méthodes statiques fonctionnent-elles mieux? Je penserais que la réduction des coûts de collecte des ordures a quelque chose à voir avec elle (car aucune instance n'est nécessaire pour des méthodes statiques); Cependant, y a-t-il quelque chose de plus? P>
3 Réponses :
La raison principale a à voir avec la pile d'appels. Alors que les méthodes d'instance ont toujours le pointeur code> de code> comme des premiers paramètres, les méthodes statiques n'ont pas cette surcharge. P>
Ce n'est que des millisecondes (ou même des fractions que sur un système rapide), mais il peut s'additionner dans des systèmes critiques de performance. P>
Si les informations contenues dans la référence implicite sont réellement nécessaires, ce qui en fait la méthode statique signifie simplement que cela nécessite qu'il soit explicite i> au lieu de cela, ce qui signifie aucune épargne réelle. Si ce n'est pas nécessaire (c'est-à-dire la méthode utilisée sans l'état d'instance), il aurait dû être statique du début car il n'est pas conceptuellement lié à une instance de l'objet.
Selon la manière dont votre structure de classe est conçue, elle transmet le message qu'aucun membre d'instance n'est utilisé par cette méthode. Cela, (et des choses comme lisonly code> et
scellés code> le cas échéant) transmet des informations supplémentaires au développeur suivant, ce qui peut les aider à prendre des décisions sur la manière de contacter quelque chose ou de déboguer le code.
Voir Raymon Chen's Quand un objet est-il disponible pour la collecte des ordures ? , "Un objet peut devenir éligible à la collecte lors de l'exécution d'une méthode sur cet objet très."
Il est très peu probable qu'ils soient inquiets de la différence de microsecondes qui est parfois i> associée à des méthodes d'instance.
Utilisation lourde des classes et des méthodes statiques, pour la simplicité et la meilleure Performance p> blockQuote>
où les avantages de performance réels em> sont liés à la configuration du système en béton et aux métriques de béton effectuées pour le domaine d'activité concrets, la simplicité d'utilisation des classes et des méthodes code> statiques >, où elle est possible, dérive de: p>
1) Clear Manifestation de «Exécution uniquement» de la méthode statique p>
2) Test d'unité facile, car vous ne traitez que d'exécution artefact (fonction statique) p>
3) L'exécution em> EM> Etat em> et sont des valeurs distinctes et distinctes, il n'y a donc aucun problème "État caché" (statique non em> varys immuables généralement un signe de mauvais design), ou une petite quantité d'entre eux autrement. p>
Globalement, le code est plus facile à gérer em>, test em> et éventuellement comprendre em>. p>
Je suis d'accord avec vous dans chaque cas. Mais la question portait sur la performance et non sur la clarté conceptuelle.
Il existe des avantages de faible performance dans l'utilisation de la statique, ou des propriétés non utilisant des propriétés, mais une fois, mais, à nouveau, cela dépend de cas de béton et de mesures concrètes.
Tests d'unité faciles? Si une méthode appelle SomedatAprovider.getlatestData (), c'est une liaison de temps de compilation difficile que vous ne pouvez pas remplacer pour des tests. Vous irez insensé en essayant d'essai unitaire que CodeBase. Si vous utilisez plutôt une injection de dépendance pour obtenir un DataProvider, vous pouvez vous moquer et tester facilement. .... C'est très très très largement tenu de la sagesse couramment comprise.
@Bridrangordon: Toute pratique du code peut être manipulée mal ou à droite, la même chose est valable de DI. S'exprimant de la simplicité des méthodes statiques, je veux dire avoir une "exécution uniquement" ou des artefacts d'exécution apatrides, pouvant être facilement testés, car ils ne sont nociés à aucun état de quelque manière que ce soit. C'est un point de ma réponse. Sinon, tout le monde est libre d'écrire le code comme il le souhaite.
Pourquoi les méthodes statiques fonctionnent-elles mieux? P>
Je ne pense pas qu'ils font. Il y a peut-être un gain dans le temps de GC si les données em> qui sont transmises à la méthode statique et sont renvoyées à partir de celle-ci laisse sur la pile. Dans ce cas, il n'est pas suivi par GC. P>
J'ai dirigé un programme et obtenu différents résultats pour mes 3 tentatives, deux fois la méthode statique était légèrement plus rapide, 1 fois (illustrée ci-dessous) la méthode d'instance était plus rapide. Toutes les données dans une plage de déviation raisonnable. Donc, ma conclusion: il n'y a pas de différence notable si elle ne néglige pas GC. p>
xxx pré> Voici un programme de test rapide p>
xxx pré> blockQquote>
Pourquoi ... voudriez-vous ignorer GC? C'est la principale raison statique "performance". Il ne s'agit pas du temps pour un appel, mais la réactivité du système que vous recevez d'éviter les pauses de GC
Même le bit de la collecte des ordures liés à une forte utilisation de méthodes statiques est spécifiquement mentionné dans le même article. Cependant, cela semble être le seul détail.
Dans le monde d'aujourd'hui de serveurs multicœurs de 3 ghz +, je doute qu'il y ait beaucoup de temps sauvé; Cependant, une variable statique est "toujours" là-bas et "toujours" adressable. S'ils sont utilisés correctement, c'est une bonne chose!
Les méthodes statiques ne nécessitent pas de vérification d'exécution pour vous assurer que l'objet appartient à la méthode est non null. Tous les chèques comme celui-ci sont effectués au moment de la compilation.
Si vous créez des instances d'objet pour passer des informations aux méthodes statiques en tant que paramètres, vous ne gagnez rien; Vous écrivez le code de style C que OOP est conçu pour imiter et faciliter la syntaxe, sans être fonctionnellement très différent. S'ils sont pas i> créer des objets pour réussir des informations autour, les méthodes sont conceptuelles statiques (telles qu'elles n'étaient associées à aucun état) et qu'il n'ya aucune raison d'avoir été des méthodes d'instance dans la première place.
Dupliqué possible de Qu'est-ce qui est meilleur? Méthodes statiques ou méthodes d'instance
Ils ont été obsessionnels de se débarrasser des retards de GC. Ce qui a parfois provoqué un utilisateur de sorte qu'il faut attendre pendant plusieurs secondes pour une mise à jour de page au lieu de 50 ms. Je sais qu'ils avaient du mal à faire face à l'imprévisibilité de GC.RegisterforforFullCnotification (). Donc, ils sont probablement allés dans l'autre sens, gardant un ensemble de travail fixe avec de nombreuses données statiques qui ne mutent que, mais ne changent pas de taille. Obtenir des méthodes statiques en dehors de cela est une donnée. Peut-être pas ce qu'ils auraient fait si .NET 4.5 aurait été disponible.
@Hans je ne suis pas sûr que "la taille de données statique" implique de quelque manière que ce soit implique des "méthodes statiques". La remarque de Helrich sur l'absence de vérification de l'exécution pour NULL semble beaucoup plus pertinente dans ce contexte.