38 votes

Pourquoi les champs publics sont-ils plus rapides que les propriétés?

J'ai été farfouillé dans XNA et vu que l' Vector3 classe elle a été en utilisant les champs plutôt que des propriétés. J'ai essayé un rapide benchmark et a constaté que, pour un struct la différence est assez dramatique (l'ajout de deux Vecteurs ensemble 100 millions de fois, a pris 2.0 s, avec des propriétés et 1.4 s avec des champs). Pour un type de référence, la différence ne semble pas que les grandes, mais il est là.

Alors, pourquoi est-ce? Je sais qu'une propriété est compilé en get_X et set_X méthodes, ce qui entraînerait un appel de la méthode de surcharge. Cependant, n'est-ce pas simple getters/setters toujours obtenir bordée par le JIT? Je sais que vous ne pouvez pas garantir que l'équipe décide de le faire, mais sûrement, c'est assez élevé sur la liste de probabilité? Quoi d'autre est là qui sépare un champ public à partir d'une propriété au niveau de la machine?

Et une chose que je me demandais: comment agit d'une auto-mise en œuvre de la propriété (public int Foo { get; set; }) 'mieux' OO-concevoir qu'un champ public? Ou pour mieux dire: comment ces deux différents? Je sais qu'en faire une propriété est plus facile avec de la réflexion, mais quelque chose d'autre? Je parie que la réponse à ces deux questions est la même chose.

BTW: je suis à l'aide .NET 3.5 SP1 qui, je crois, correction de problèmes où les méthodes avec les structures (ou les méthodes de structs, je ne suis pas sûr) n'étaient pas en bordée, de sorte que n'est-il pas. Je pense que je suis en utilisant au moins, c'est certainement installé mais encore une fois, je suis sous Vista 64-bit SP1 qui devrait avoir DX10.1 sauf que je n'ai pas de DX10.1 ..

Aussi: ouais, j'ai fait tourner une version validée :)

EDIT: j'apprécie les réponses rapides les gars, mais j'ai indiqué que je ne connais que l'accès à la propriété est un appel de méthode, mais que je ne sais pas pourquoi, sans doute, bordée méthode est plus lent qu'un accès sur le terrain.

EDIT 2: j'ai Donc créé un autre struct qui ont utilisé explicite GetX() méthodes (o comment je n'en ai pas raté mon Java jours en tout) et qui ont effectué la même si j'ai désactivé l'in-lining sur elle (par le biais [MethodImplAttribute(MethodImplOptions.NoInlining)]) ou pas, donc, conclusion: non-static méthodes sont apparemment jamais inline, même pas sur des structures.

Je pensais qu'il y avait des exceptions, où l'équipe pourrait optmize la méthode virtuelle appel. Pourquoi ne peut-elle pas sur des structures qui ne connaissent pas l'héritage et donc un appel de méthode ne peut point d'une méthode possible, non? Ou est-ce parce que vous pouvez mettre en œuvre une interface sur elle?

C'est un peu dommage, car ça va vraiment me faire penser à l'aide de propriétés sur les performances essentielles des trucs, mais à l'aide de champs me fait me sentir sale et je pourrais tout aussi bien écrire ce que je suis en train de faire en C.

EDIT 3: j'ai trouvé ce poster sur exactement le même sujet. Sa fin, la conclusion est que l'appel de propriété ne se optimisé loin. Je pourrais aussi ai juré que j'ai lu beaucoup de fois, que de simples propriétés de lecture/définition obtiendrez en bordée, malgré callvirt dans l'IL. Donc suis-je en train de devenir folle?

EDIT 4: Reed Copsey posté la réponse dans un commentaire ci-dessous:

Re: Edit3 - voir mis à jour mon commentaire: je crois que c'est JIT x86 vs JIT x64 questions. le JIT en x64 n'est pas aussi mature. Je m'attends à de MS pour améliorer ce plus rapidement que les systèmes 64 bits sont mis en ligne chaque jour. – Reed Copsey

Et ma réponse à sa réponse:

Merci, c'est la réponse! J'ai essayé de forcer un x86 construire et à toutes les méthodes sont tout aussi rapides, et beaucoup plus rapide que la version x64. C'est très choquant pour moi en fait, je n'avais aucune idée que j'étais vivant dans l'âge de pierre sur mon système d'exploitation 64 bits.. je vais inclure votre commentaire dans ma réponse afin qu'il soit mieux. – JulianR

Merci à tous!

15voto

Reed Copsey Points 315315

Edit 2:

J'ai eu une autre idée ici:

Vous avez mentionné que vous êtes en cours d'exécution sur x64. J'ai testé ce même problème sur x86, et vu la même performance lors de l'utilisation de l'auto-propriétés contre les champs. Cependant, si vous regardez autour de vous Connecter et de diffusion de la liste/les posts sur le forum, il y a de nombreuses références en ligne pour le fait que le x64 CLR JIT est une autre base de code, et très différentes caractéristiques de performance que le JIT x86. Ma conjecture est que c'est un endroit où x64 est toujours à la traîne.

Aussi, pour info, la struct/méthode/etc chose fixe en .net 3.5sp1 était sur le x86 côté, et était le fait que les appels de méthode qui a pris les structures en tant que paramètre ne serait jamais inline sur x86 avant .net3.5sp1. C'est à peu près indifférent à cette discussion sur votre système.


Edit 3:

Autre chose: pourquoi XNA est à l'aide de champs. J'ai vraiment été dans le Jeu Fest où ils ont annoncé le XNA. Rico Mariani a présenté un exposé où il a beaucoup de points qui sont sur son blog. Il semble que le XNA les gens ont des idées semblables quand ils ont développé certains des objets du noyau. Voir:

http://blogs.msdn.com/ricom/archive/2006/09/07/745085.aspx

En particulier, consultez le point n ° 2.


Quant à savoir pourquoi automatique propriétés sont mieux que les champs publics:

Ils vous permettent de changer la mise en œuvre dans la v2 de votre classe, et ajouter de la logique dans la propriété get/set routines que nécessaire, sans changer votre interface à vos utilisateurs finaux. Cela peut avoir un effet profond sur votre capacité à maintenir votre bibliothèque, et le code au fil du temps.

---- À partir de l'original post - mais a découvert que ce n'était pas la question--------

Avez-vous été courir un communiqué de construire à l'extérieur de VS? Qui peut être une explication de pourquoi les choses ne sont pas optimisés. Souvent, si vous êtes en VS, et même une version optimisée de construire, le VS processus hôte désactive de nombreuses fonctions de l'équipe. Cela peut provoquer des tests de performances, pour changer.

5voto

JaredPar Points 333733

Vous devriez lire cet article de Vance. Il explique en détail pourquoi les méthodes ne sont pas toujours alignées par le JIT, même s'il semble tout à fait évident qu'elles devraient l'être.

http://blogs.msdn.com/vancem/archive/2008/08/19/to-inline-or-otot-to-inline-that-is-the-question.aspx

3voto

Michael Points 34110

XNA doit cibler la XBox 360 et le JIT dans le .NET Compact Framework n'est pas aussi sophistiqué que son homologue de bureau. Les méthodes de la propriété inline .NET CF JIT'er ne seront pas intégrées.

3voto

tvanfosson Points 268301

L'accès à un champ est juste un souvenir de référence tandis que l'utilisation d'une propriété est en fait l'invocation d'une méthode et comprend l'appel de la fonction de surcharge. La raison d'utiliser des propriétés plutôt que de champs est d'isoler votre code de changements et de fournir une meilleure granularité d'accès. Par pas exposer votre domaine directement vous avez plus de contrôle sur la façon dont l'accès se fait. L'aide automatique des champs vous permet d'obtenir généralement des getter/setter comportement, mais construit dans la capacité de changement sans une nécessité pour que les modifications se propagent à d'autres parties du code.

Par exemple, disons que vous souhaitez modifier votre code, de sorte que l'accès à un champ est contrôlé par le courant rôle de l'utilisateur. Si vous avait exposé le domaine public, vous auriez à toucher toutes les parties du code qui ont eu accès à elle. De l'exposer à travers une propriété permet de modifier le code de la propriété pour ajouter votre nouvelle exigence , mais n'a pas d'entraîner des modifications du code qui y accède.

3voto

FerranB Points 9532
  • Les champs publics sont des assignations directes
  • Les propriétés sont des méthodes, puis plus de code, insignifiantes mais plus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X