2009-12-04 2 views
1

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

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

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

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

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

ответ

1

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

После того, как вы внутри методы на загруженном типе, да: регулярные G и т.д. применяется, как правило (обратите внимание, что проверка безопасности может сделать вещи LITTLE медленнее, если оно частично доверено, но не сильно).

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

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

Итак: как вы к нему обращаетесь?

+0

Marc, Мы используем Activator.CreateInstance() и передаем возвращаемый объект известному типу класса. С этого момента он всегда доступен через этот строго типизированный экземпляр. Мы работаем с C# 2 и скоро перейдем к C# 3/4. – Ash

+0

Интересный вопрос о проверках безопасности. Это может быть то, о чем говорил мой коллега, хотя в то время они этого не говорили. – Ash

+0

Я думаю, что ваш коллега вводит в заблуждение разницу между * загрузкой * что-то через отражение и * вызывая все * через отражение. Похоже, он должен хорошо работать в вашем сценарии с известным типом класса. –

1

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

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

+0

Любые ссылки, такие как веб-страницы, блоги и т. Д.? – Ash

+0

Не совсем, просто глава 4 .NET Framework от Джо Даффи. Если у вас есть доступ, откройте эту главу и прочитайте раздел «Загрузка сборки» и часть метаданных Inside Assembly. –

0

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

+0

Вы неправильно поняли мой вопрос, см. NB. – Ash

+0

Да, ты прав. Сожалею.Хорхе прав, исполнение кода - это тот же самый код, который был вызван. –