Производительность кода во время выполнения в классе, созданном с использованием отражения, по сравнению с «нормальным» классом - PullRequest
1 голос
/ 04 декабря 2009

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 04 декабря 2009

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

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

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

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

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

1 голос
/ 04 декабря 2009

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

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

0 голосов
/ 04 декабря 2009

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

...