2012-03-30 3 views
6

Для модульного тестирования и издевательств стало обычной практикой объявлять методы и свойства виртуальными. Возникает ли влияние производительности при объявлении виртуального как предполагаемого не виртуального?Влияние виртуальных методов на производительность

+0

Вы думаете _design для testability_ просто делает все 'virtual' и все классы' open'? Хмм ... –

+0

@StefanHanke: Я не вижу ничего, предполагая, что OP думает, что это просто * это. –

+0

Да, я не думаю, что это должно быть сделано, когда это не нужно ... Это всего лишь одна мера, которая может улучшить тестируемость, когда это необходимо – TGH

ответ

9

В общем, различие заключается в том, что виртуальные методы вызывают с использованием кода Opel Callvirt, тогда как не виртуальные методы используют стандартный вызов Opcode. Коды Opcodes, безусловно, быстрее, чем Callvirt, но я никогда не видел их почти достаточно значительными, чтобы оправдать принятие решений на основе этого.

Premature optimization is the root of all evil.

+0

IIRC, компилятор C# будет использовать CallVirt для всех методов экземпляра, независимо от того, являются ли они виртуальными. Таким образом, CLR выполняет проверку недействительности. –

+0

@JohnSkeet Значит ли это, что в конце дня нет никакой разницы? – TGH

+0

Good point John - вы правы, за исключением методов экземпляров типа значения, которые, как мне кажется, для которых компилятор испускает Opcodes.Call. – Jeff

1

Нет, не особо.

Это не то, что вы собираетесь заметить.

1

я не знаю специфику, но я знаю, что вам не придется беспокоиться об этом на 99% приложений там.

btw - Если вы выбираете Mock интерфейсы вместо классов, вам не понадобятся виртуальные методы.

Успехов, Том

+0

У вас такой же косвенный «штраф» с интерфейсом как виртуальный метод. – leppie

Смежные вопросы