Виртуальный интерфейс vs poco, что быстрее?
Вопрос
Я поддерживаю приложение, которое было разработано следующим образом:
messy code --abuses--> simplePoco (POCO data capsule)
Капсула данных - это простой класс с множеством средств получения и установки (свойств) Он использует платформу DI и последовательно использует контейнер IoC для предоставления экземпляров капсулы данных (мне повезло!).
Проблема в том, что мне нужно внедрить механизм "уведомления об изменениях" в simplePoco
messy code --abuses--> simplePoco
|
V
changes logger,
status monitor
(I wanna know about changes)
У меня есть несколько вариантов:
Представить
IPoco
и измените беспорядочный код, чтобы я мог иметьsimplePoco
для скорости илиnotifyingPoco
когда я хочу уведомление об изменении (выборочно медленное)?или...Сделайте все виртуальным и создайте мой собственный кастом
notifyingPoco
класс на вершинеsimplePoco
(еще медленнее)?шаблоны проектирования, которые я не знаю?
Это клиент-серверная система, но я просто модифицирую серверную часть, поэтому, если возможно, я бы предпочел не прикоснитесь к грязному коду или клиентскому коду (есть сериализаторы, отражения и страшные материалы ниндзя ...), чтобы случайно ничего не сломать.
Будет ли использование интерфейса препятствовать JIT встраиванию вызовов в getter / setter?
Каков наилучший способ, учитывая, что экземпляры simplePoco являются сильно подвергался насилию?
Решение
Любой вид виртуального вызова (будь то в интерфейсе или непосредственно в классе - ВСЕ интерфейсные вызовы являются виртуальными!) не будут встроены CLR JIT.Тем не менее, интерфейсные вызовы немного медленнее, потому что они всегда должны проходить через потенциально удаленный / проксируемый путь, и потому что они должны сдвигаться this
-указатель на точку в начале класса перед входом в тело функции.Виртуальные вызовы непосредственно к членам класса никогда не должны выполнять сдвиг, и, если только класс не является производным от MarshalByRefObject
, не нажимайте на проверки прокси-сервера.
Тем не менее, различия в производительности между этими двумя очень незначительны, поэтому вам, вероятно, следует игнорировать их и вместо этого сосредоточиться на чистоте дизайна и простоте реализации.