Как косвенное влияние, вносимое интерфейсами и фабриками, влияет на производительность? - PullRequest
1 голос
/ 20 августа 2010

Я хотел бы улучшить тестируемость некоторого унаследованного кода.Чтобы добиться этого, я представляю интерфейсы для существующих классов (и уже существующие классы реализуют их) и фабрик, которые создают экземпляр тестового объекта или объекта исходного класса, в зависимости от некоторых параметров конфигурации.

Iможет предвидеть некоторую внутреннюю обратную связь в духе «но это повлияет на производительность», но я хотел бы иметь возможность протестировать некоторый код (в данном случае для сервисного уровня) без необходимости развертывания всех нижележащих уровней и настройки сервера базы данных.

Есть ли у вас опыт, когда введенное косвенное влияние заметно повлияло на производительность?Что бы было конструктивно ответить на вышеупомянутую обратную связь?

Спасибо,

Martijn

Ответы [ 3 ]

3 голосов
/ 20 августа 2010

Согласно книге Дон Бокса (Essential .NET, том 1), эффект вызова функции в интерфейсе по сравнению с вызовом ее в классе - это одна машинная инструкция, поскольку есть еще одна косвенность. Это будет означать, что для процессора с частотой 2 ГГц вызов метода интерфейса будет на 0,0000000005 секунд медленнее, чем для метода класса.

Это относится к реализации .net версии 1 (у меня есть старая редакция этой книги). Я не уверен, сильно ли это изменилось для более новых версий или как это применимо к Mono, но я определенно не принял бы драматические эффекты.

Как вы видите, на современных компьютерах эффект должен быть незначительным, за исключением редкого случая, когда вам приходится охотиться каждую наносекунду.

1 голос
/ 20 августа 2010

Единственное отличие в вызове метода интерфейса состоит в том, что гарантированно будет вызовом виртуального метода. Это было бы необязательно при прямом вызове метода экземпляра класса, в зависимости от того, объявили ли вы его виртуальным или нет.

На практике это не имеет значения, компилятор VB.NET использует тот же прием, что и компилятор C #. Он делает косвенный вызов, даже если метод не является виртуальным, что полезно для его неявной проверки нулевой ссылки. Только статический вызов метода может быть дешевле.

Нет смысла беспокоиться об этом.

1 голос
/ 20 августа 2010

Краткий ответ: не будет никакой разницы.

Более длинный ответ: это почти наверняка не будет иметь никакого значения вообще. Единственная реальная разница в производительности должна заключаться в том, что вызовы методов через интерфейс не могут быть встроенными, поэтому любые методы, которые были встроены в исходный класс, будут медленнее с интерфейсом. Тем не менее, мы говорим только о нескольких дополнительных наносекундах за вызов, поэтому , если у вас есть встроенные методы в классе, и , если они вызываются миллионы раз, то вы можете увидеть заметное разница. Однако, если у вас есть такой метод, который ограничивает производительность вашего приложения, то специалисты по производительности наверняка уже измерили это и смогут вам сказать. Не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...