Производительность кода во время выполнения в классе, созданном с использованием отражения, по сравнению с «обычным» классом

StackOverflow https://stackoverflow.com/questions/1846587

Вопрос

Это производительность времени выполнения (время выполнения) кода в классе, который загружается посредством отражения. идентичный к тому же коду, когда класс создается с использованием нового ключевого слова?

Я говорю да.Но я обсуждал это с коллегой, который считает, что код, ориентированный на отражение, всегда медленнее.

Я считаю, что независимо от того, как класс был изначально загружен/создан, производительность будет идентичной, поскольку JIT-компилятор не заботится о том, как класс был загружен.

Я прав?В любом случае, я был бы признателен за любые ссылки, которые могут помочь прояснить это.

(Примечание:Я не говорю о производительности создание класс, использующий отражение, а не новое ключевое слово.Я имею в виду фактический код методов класса после его создания.)

Это было полезно?

Решение

Это зависит от того, как вы это выполните ;-p

Как только ты внутри методы загруженного типа, да:обычный GIT и т. д. применяется нормально (обратите внимание, что проверки безопасности могут усложнить ситуацию). маленький медленнее, если ему частично доверяют, но ненамного).

Но сначала вам нужно вызывать некоторый код динамического объекта:

  • Если вы можете привести объект к статически известному интерфейсу или базовому классу, он будет идентичен.
  • Если это невозможно, но вы можете привязать определенные операции к известным делегатам (например, Func<string,int>, с помощью Delegate.CreateDelegate), то это будет почти так же быстро, но менее удобно.
  • Если вы делаете все через DynamicInvoke(), это будет похоже на патоку.
  • В версии 4.0 dynamic может предложить промежуточный вариант, поскольку он предлагает утиную печать с оптимизированным кэшированием для каждого типа.

Так:как вы получаете к нему доступ?

Другие советы

Да, после загрузки производительность та же.

Снижение производительности отражения связано с чтением метаданных из сборки, но время выполнения будет точно таким же.То есть, как только экземпляр будет создан и у вас есть ссылка на него, он будет вести себя как любой другой класс, который у вас есть (включая JIT-компиляцию и все остальное).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top