Virtual vs Interface poco, ce qui est plus rapide?
Question
Je suis maintenant une application qui a été conçu comme ceci:
messy code --abuses--> simplePoco (POCO data capsule)
La capsule de données est une classe simple avec beaucoup de accesseurs (propriétés) Il utilise un cadre de DI et utiliser systématiquement le conteneur IoC pour fournir des instances de la capsule de données (me chance!).
Le problème est, je dois introduire un mécanisme « notification changement » dans simplePoco
messy code --abuses--> simplePoco
|
V
changes logger,
status monitor
(I wanna know about changes)
J'ai quelques options:
-
Introduire un
IPoco
et modifier le code en désordre, afin que je puisse avoirsimplePoco
pour la vitesse ounotifyingPoco
quand je veux changer la notification (sélective lent)? ou ... -
Faire tout virtuel et rouler ma propre classe
notifyingPoco
personnalisée au-dessus desimplePoco
(encore plus lent)? -
modèles de conception que je ne sais pas?
Il est un système client / serveur, mais je suis juste de modifier la partie serveur donc si possible, je préfère pas toucher le code désordre ou le code client (il y a serializers et réflexions et Ninja effrayant enfourne ...) pour ne pas casser quoi que ce soit accidentellement.
Plût à l'aide d'une interface empêche JIT de inline les appels à getter / setter?
Quelle est la meilleure façon d'aller considérant que les instances simplePoco sont très abusé?
La solution
Tout type d'appel virtuel (que ce soit sur l'interface ou directement sur une classe - tous appels d'interface sont virtuelles!) Ne seront pas inline par JIT CLR. Cela dit, les appels d'interface sont un peu plus lent, car ils doivent toujours passer par le potentiellement télécommandables / chemin approximé, et parce qu'ils doivent passer this
-pointeur vers le point au début de la classe avant d'entrer dans le corps de la fonction. appels virtuels directement sur les membres de la classe ont jamais à faire le déplacement, et, à moins que la classe est dérivée de MarshalByRefObject
, ne touchez pas les contrôles de mandatement.
Cela dit, les différences de performance entre ces deux sont très mineures, alors vous devriez probablement ignorer eux et se concentrer sur la propreté de la conception et la facilité de mise en œuvre à la place.