Virtuelle vs Schnittstelle poco, was ist schneller?
Frage
Ich bin Aufrechterhaltung einer Anwendung, die wie folgt entwickelt wurde:
messy code --abuses--> simplePoco (POCO data capsule)
Die Datenkapsel ist eine einfache Klasse mit vielen Getter und Setter (Eigenschaften) Es verwendet einen DI-Framework und konsequent die IoC-Container verwenden Instanzen der Datenkapsel zur Verfügung zu stellen (lucky me!).
Das Problem ist, ich brauche einen „Änderungsmitteilung“ Mechanismus in simplePoco
einzuführen
messy code --abuses--> simplePoco
|
V
changes logger,
status monitor
(I wanna know about changes)
Ich habe ein paar Optionen:
-
ein
IPoco
einführen und den chaotischen Code ändern, so dass ichsimplePoco
für die Geschwindigkeit odernotifyingPoco
haben kann, wenn ich Benachrichtigung will ändern (selektiv langsam)? oder ... -
Machen Sie alles virtuell und rollen meine eigene benutzerdefinierte
notifyingPoco
Klasse auf dersimplePoco
(noch langsamer)? -
Design-Muster, die ich weiß nicht?
Es ist ein Client / Server-System, aber ich bin zu modifizieren nur den Server-Teil so, wenn möglich, würde ich eher nicht berühren Sie den chaotisch-Code oder den Client-Code (es gibt Serializer und Reflexionen und beängstigend ninja stopft ...) als nicht versehentlich etwas zu brechen.
wäre eine Schnittstelle verhindert JIT von inlining die Anrufe / Setter Getter?
Was ist der beste Weg, unter Berücksichtigung gehen, dass simplePoco Instanzen stark missbraucht?
Lösung
Jede Art von virtueller Call (ob auf der Schnittstelle oder direkt auf einem Klasse - alle Schnittstelle Anrufe sind virtuelle!) Nicht durch CLR JIT inlined werden. Dies vorausgeschickt, sind Schnittstelle Anrufe etwas langsamer, weil sie immer durch die potenziell remoted / proxied Weg gehen müssen, und weil sie müssen this
-Zeiger auf Punkt am Anfang der Klasse verschieben, bevor der Körper der Funktion eingeben. Virtuelle Anrufe direkt auf die Teilnehmer nie die Verschiebung zu tun haben, und, es sei denn, die Klasse von MarshalByRefObject
abgeleitet wird, kann die Proxy-Kontrollen nicht getroffen.
Wie gesagt, die Leistungsunterschiede zwischen diesen beiden sehr gering sind, so dass Sie wahrscheinlich sie auf Sauberkeit von Design ignorieren sollte und konzentrieren und statt Implementierung erleichtern.