Ускорение Reflection API с делегатом в .NET / C # - PullRequest
6 голосов
/ 21 июня 2011

Этот пост имеет комментарий if you need to call the method multiple times, use reflection once to find it, then assign it to a delegate, and then call the delegate..

  • Как и почему эта delegate работает быстрее?Может у кого-нибудь есть пример?
  • Могу ли я назвать это caching?Если да, есть ли другой метод, кроме этого метода кэширования с делегатом?

ADDED

Я привел пример использования delegate здесь .

Ответы [ 5 ]

4 голосов
/ 21 июня 2011

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

Итак, это не тип «делегат», который работает быстрее, просто вы «вычисляете» один раз и «используете» его несколько раз, что дает вам увеличение скорости.

1 голос
/ 21 июня 2011

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

1 голос
/ 21 июня 2011

Fist off, это не кеширование.Вы не сохраняете копию метода в «более близком» месте, вы просто держитесь за ссылку на этот метод.

Подумайте о шагах, необходимых для вызова метода с использованием отражения.(доступ к данным рефлексии из сборки, поиск метода / пространства имен / класса по имени и т. д.), последний шаг - получение ссылки (и не позволяйте никому говорить, что делегат является указателем!)к методу и вызывая его.Когда вы используете делегата, вы делаете только последний шаг и избавляете себя от всей головной боли, которая приходит с отражением.

1 голос
/ 21 июня 2011

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

1 голос
/ 21 июня 2011

Delegate.CreateDelegate

Вероятно, лучшие документы на MSDN:)

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