Что такое "стоимость" of.NET отражение? [дубликат]


Возможные Дубликаты:
насколько дорого стоит отражение .NET?

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

какова "реальная" стоимость использования отражения?

стоит ли прилагать усилия для часто отражаемых типы для кэшированного отражения, такие как наш собственный объектный код pre-LINQ DAL для всех свойств определений таблиц?

будет ли объем кэширующей памяти перекрывать использование ЦП отражения?

5 64

5 ответов:

отражение требует большого количества метаданных типа, которые должны быть загружены и затем обработаны. Это может привести к увеличению объема памяти и замедлению выполнения. Согласно в этой статье изменение свойств происходит примерно в 2,5 х-3 раза медленнее, а вызов метода-в 3,5 х-4 раза медленнее.

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

существует также элемент сложности, который отражение может добавить к коду, что делает его значительно более запутанным и, следовательно, трудным для работы. Некоторые люди, как Скотт Хансельман считают, что с помощью отражения, вы часто делаете больше проблем, чем решить. Это особенно верно, если ваши команды в основном младшие дэвы.

вам может быть лучше заглянуть в DLR (динамическая языковая среда выполнения), если вам нужно много динамического поведения. С новые изменения, поступающие в .NET 4.0 вы можете увидеть, если вы можете включить некоторые из них в свое решение. Добавленная поддержка dynamic от VB и C# делает использование динамического кода очень элегантным и создает ваши собственные динамические объекты довольно прямолинейно.

удачи.

EDIT: я еще немного покопался на сайте Скотта и нашел это подкаст на размышления. Я не слушал его, но это может быть стоит время.

есть много вещей, которые вы можете сделать, чтобы ускорить отражение. Например, если вы делаете много доступа к свойствам, то HyperDescriptor может быть полезным.

если вы делаете много метод-invoke, то вы можете кэшировать методы для типизированных делегатов с помощью Delegate.CreateDelegate - затем выполняется проверка типа и т. д. Только один раз (во время CreateDelegate).

если вы делаете много строительства объекта, то Delegate.CreateDelegate не поможет (вы не можете использовать его в конструкторе) - но (в 3,5) Expression можно использовать для этого, снова компилируя в типизированный делегат.

так что да: отражение медленно, но вы можете оптимизировать его без слишком большой боли.

с большой силой приходит большая ответственность.

Как вы говорите, отражение имеет расходы, связанные с ним, и в зависимости от того, сколько отражение вы делаете это может значительно замедлить работу приложения.

одно из самых подходящих мест для его использования-это IoC (инверсия управления), поскольку в зависимости от размера вашего приложения, вероятно, будет иметь больше преимуществ, чем нет.

Спасибо за отличные ссылки и отличные комментарии, особенно со стороны разработчиков Jr, которые попали прямо на деньги.

для нас это проще сделать нашим младшим разработчикам:

[TableName("Table")]
public class SomeDal : BaseDal
{
    [FieldName("Field")]
    public string Field
}

а не некоторые более крупные побуждения DAL. Это ускоряет их строительство объектов DAL, скрывая при этом все внутренние разработки для старших разработчиков, чтобы выпотрошить.

жаль, что LINQ не вышел раньше, я чувствую, что иногда мы писали половину оно.

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

единственное решение-хорошая документация и тщательный блок тестирование.