Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
894
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Насколько дорого стоит .NET отражение?
Я постоянно слышу, как плохо использовать отражение. Хотя я обычно избегаю размышлений и редко нахожу ситуации, когда без них невозможно решить мою проблему, мне было интересно...
Для тех, кто использовал отражение в приложениях, вы измерили хиты производительности и, действительно ли это так плохо?
В своем докладе " производительность повседневных вещей" Джефф Рихтер показывает, что вызов метода рефлексией примерно в 1000 раз медленнее , чем вызов его обычно.
Совет Джеффа: если вам нужно вызвать метод несколько раз, используйте отражение один раз, чтобы найти его , затем назначьте его делегату, а затем вызовите делегат.
Это. Но это зависит от того, что вы пытаетесь сделать.
Я использую отражение для динамической загрузки сборок (плагинов), и его производительность "penalty" не является проблемой, так как эта операция является чем-то, что я делаю во время запуска приложения.
Однако, если вы отражаете внутри серии вложенных циклов с вызовами отражения на каждом, я бы сказал, что вам следует пересмотреть свой код :)
Для операций "a couple of time" отражение вполне приемлемо, и вы не заметите никаких задержек или проблем с ним. Это очень мощный механизм, и он даже используется .NET, так что я не вижу, почему бы вам не попробовать.
Производительность отражения будет зависеть от реализации (повторяющиеся вызовы должны быть кэшированы, например: entity.GetType().GetProperty("PropName")). Поскольку большая часть отражения, которое я вижу ежедневно, используется для заполнения сущностей из читателей данных или других структур типа репозитория, я решил проверить производительность специально на отражении, когда оно используется для получения или задания свойств объектов.
Я придумал тест, который считаю справедливым, поскольку он кэширует все повторяющиеся вызовы и только умножает фактический вызов SetValue или GetValue. Весь исходный код для теста производительности находится в bitbucket по адресу: https://bitbucket.org/grenade/accessortest . Пристальное внимание приветствуется и поощряется.
Вывод, к которому я пришел, заключается в том, что это непрактично и не обеспечивает заметных улучшений производительности для удаления отражения на уровне доступа к данным, который возвращает менее 100 000 строк в то время, когда реализация отражения выполнена хорошо.
Приведенный выше график демонстрирует выход моего маленького бенчмарка и показывает, что механизмы, которые превосходят рефлексию, делают это заметно только после отметки в 100 000 циклов. Большинство DALs возвращает только несколько сотен или, возможно, тысяч строк одновременно, и на этих уровнях отражение работает просто отлично.
Но не массово. У меня никогда не было проблем с ним в разработке настольных компьютеров, если только, как утверждает Мартин, вы не используете его в глупом месте. Я слышал, что у многих людей есть совершенно иррациональные опасения по поводу его эффективности в разработке настольных компьютеров.
Однако в компактной структуре (в которой я обычно нахожусь) это в значительной степени анафема , и в большинстве случаев ее следует избегать, как чумы. Я все еще могу выйти сухим из воды, используя его нечасто, но я должен быть очень осторожен с его применением, которое гораздо менее весело. :(
Мой самый важный опыт состоял в написании кода для сравнения любых двух сущностей данных одного и того же типа в большой объектной модели по свойствам. Он заработал, попробовал, побежал, как собака, очевидно.
Я был в отчаянии, а затем внезапно понял, что, изменив логику, я мог бы использовать тот же алгоритм для автоматической генерации методов для выполнения сравнения, но статически получить доступ к свойствам. Адаптация кода для этой цели не заняла много времени, и у меня была возможность провести глубокое сравнение свойств сущностей со статическим кодом, который можно было обновить одним нажатием кнопки при каждом изменении объектной модели.
Моя точка зрения заключается в следующем: в беседах с коллегами, поскольку я несколько раз указывал, что их использование отражения может заключаться в автогенерации кода для компиляции, а не в выполнении операций во время выполнения, и это часто стоит рассмотреть.
Это достаточно плохо, что вы должны беспокоиться даже о том, что отражение выполняется внутренне библиотеками .NET для критичного к производительности кода.
Следующий пример устарел-правда в то время (2008), но давно исправлен в более поздних версиях CLR. Однако рефлексия в целом - все же довольно дорогостоящая вещь!
Пример: никогда не следует использовать член, объявленный как "Object" в операторе блокировки (C#) / SyncLock (VB.NET) в высокопроизводительном коде. Почему? Поскольку CLR не может зафиксировать тип значения, это означает, что он должен выполнить проверку типа отражения во время выполнения, чтобы увидеть, является ли ваш объект на самом деле типом значения, а не ссылочным типом.
Как и во всем программировании, вы должны сбалансировать затраты на производительность с любой полученной выгодой. Рефлексия-бесценный инструмент, если использовать ее с осторожностью. Я создал библиотеку сопоставления O/R в C#, которая использовала отражение для выполнения Привязок. Это сработало фантастически хорошо. Большая часть кода отражения была выполнена только один раз, поэтому любое снижение производительности было довольно небольшим, но преимущества были велики. Если бы я писал Новый запутанный алгоритм сортировки, я бы, вероятно, не использовал отражение, так как он, вероятно, будет плохо масштабироваться.
Я понимаю, что не совсем ответил на ваш вопрос здесь. Я хочу сказать, что на самом деле это не имеет значения. Используйте отражение там, где это необходимо. Это просто еще одна языковая функция, которую вам нужно узнать, как и когда использовать.
Как и во всем остальном, все дело в оценке ситуации. В DotNetNuke есть довольно основной компонент под названием FillObject , который использует отражение для заполнения объектов из потоков данных.
Это довольно распространенный сценарий, и есть статья о MSDN, использующая отражение для привязки бизнес-объектов к элементам управления формы ASP.NET , которая охватывает проблемы производительности.
Помимо производительности, одна вещь, которую я не люблю в использовании отражения в этом конкретном сценарии, заключается в том, что оно имеет тенденцию уменьшать способность понимать код с первого взгляда, что для меня не стоит усилий, когда вы считаете, что вы также теряете безопасность времени компиляции в отличие от строго типизированных наборов данных или чего-то вроде LINQ to SQL .
Отражение может оказать заметное влияние на производительность, если вы используете его для частого создания объектов. Я разработал приложение, основанное на составном блоке приложений UI , который сильно полагается на отражение. Наблюдалось заметное снижение производительности, связанное с созданием объектов с помощью отражения.
Однако в большинстве случаев нет никаких проблем с использованием отражения. Если вам нужно только проверить некоторые assembly, я бы рекомендовал Mono.Cecil , который очень легкий и быстрый
Отражение является дорогостоящим из-за большого количества проверок, которые должна выполнять среда выполнения всякий раз, когда вы делаете запрос на метод, соответствующий списку параметров. Где-то глубоко внутри существует код, который перебирает все методы для типа, проверяет его видимость, проверяет возвращаемый тип, а также проверяет тип каждого параметра. Все это требует времени.
Когда вы выполняете этот метод внутренне, есть некоторый код, который делает такие вещи, как проверка того, что вы передали совместимый список параметров перед выполнением фактического целевого метода.
Если это возможно, всегда рекомендуется кэшировать дескриптор метода, если вы собираетесь постоянно использовать его в будущем. Как и все хорошие советы по программированию, часто имеет смысл избегать повторения. В этом случае было бы расточительно постоянно искать метод с определенными параметрами, а затем выполнять его каждый раз.
Покопайтесь вокруг источника и посмотрите, что делается.
Отражение не приводит к резкому снижению производительности вашего приложения. Вы можете сделать некоторые вещи быстрее, не используя рефлексию, но если рефлексия-это самый простой способ достичь некоторой функциональности, то используйте ее. Вы всегда можете выполнить рефакторинг кода от отражения, если он становится перфорация проблемы.