Я читал об виртуальных методах и их вызовах. Как обсуждалось here и here, я пришел к выводу, что они не должны быть такими разными.Виртуальные методы медленнее, чем невиртуальные методы для вызова
Компилятор C# испускает IL-код, который вызывает статические методы с помощью команды IL-call
и вызывает виртуальные/не виртуальные элементы на callvirt
. Кажется, что задача JIT состоит в том, чтобы выяснить, действительно ли объект, вызываемый из метода, является нулевым или нет. Таким образом, проверка одинакова для обоих.
Также, как обсуждалось в первой статье, кажется, что vtables или таблицы, содержащие метаданные в определениях методов, сглаживаются во время компиляции. Другими словами, таблицы содержат именно тот метод, который должен вызвать объект, без необходимости рекурсивного поиска в цепочке наследования.
С учетом вышесказанного, почему виртуальные методы рассматриваются медленнее? Может быть, один уровень косвенности (если таковой имеется), который имеет большую сделку? Пожалуйста, объясните ...
* CLR вызывает только статические методы по вызову IL инструкция * вводит в заблуждение. Это компилятор C#, который испускает команду 'call' для статических и' callvirt', например, методов. Другие компиляторы могут свободно реализовать его по-своему. CLR не имеет к этому никакого отношения. –
@SriramSakthivel True. Я перефразирую. –
Связанный: http://stackoverflow.com/questions/530799/what-are-the-performance-implications-of-marking-methods-properties-as-virtual –