Производительность кода во время выполнения в классе, созданном с использованием отражения, по сравнению с «обычным» классом
-
12-09-2019 - |
Вопрос
Это производительность времени выполнения (время выполнения) кода в классе, который загружается посредством отражения. идентичный к тому же коду, когда класс создается с использованием нового ключевого слова?
Я говорю да.Но я обсуждал это с коллегой, который считает, что код, ориентированный на отражение, всегда медленнее.
Я считаю, что независимо от того, как класс был изначально загружен/создан, производительность будет идентичной, поскольку JIT-компилятор не заботится о том, как класс был загружен.
Я прав?В любом случае, я был бы признателен за любые ссылки, которые могут помочь прояснить это.
(Примечание:Я не говорю о производительности создание класс, использующий отражение, а не новое ключевое слово.Я имею в виду фактический код методов класса после его создания.)
Решение
Это зависит от того, как вы это выполните ;-p
Как только ты внутри методы загруженного типа, да:обычный GIT и т. д. применяется нормально (обратите внимание, что проверки безопасности могут усложнить ситуацию). маленький медленнее, если ему частично доверяют, но ненамного).
Но сначала вам нужно вызывать некоторый код динамического объекта:
- Если вы можете привести объект к статически известному интерфейсу или базовому классу, он будет идентичен.
- Если это невозможно, но вы можете привязать определенные операции к известным делегатам (например,
Func<string,int>
, с помощьюDelegate.CreateDelegate
), то это будет почти так же быстро, но менее удобно. - Если вы делаете все через
DynamicInvoke()
, это будет похоже на патоку. - В версии 4.0
dynamic
может предложить промежуточный вариант, поскольку он предлагает утиную печать с оптимизированным кэшированием для каждого типа.
Так:как вы получаете к нему доступ?
Другие советы
Да, после загрузки производительность та же.
Снижение производительности отражения связано с чтением метаданных из сборки, но время выполнения будет точно таким же.То есть, как только экземпляр будет создан и у вас есть ссылка на него, он будет вести себя как любой другой класс, который у вас есть (включая JIT-компиляцию и все остальное).
Это зависит от того, как вы используете отражение.Это всегда медленнее, но вы можете сделать разницу во времени очень маленькой, если используете IL-эмитт для создания фабричного метода во время выполнения.Если вы используете простой Activator.CreateInstance, это будет намного медленнее.