Когда вы думаете об этом, рефлексия впечатляет своей быстротой.
Кэшируемый делегат из ConstructorInfo
или MethodInfo
может быть вызван со скоростью, сопоставимой с любым другим делегатом.
Делегат, созданный из ILGenerator.Emit
(который, кстати, не новый, он был в .NET начиная с версии 1), также может быть вызван так же быстро.
Объект, полученный посредством излучения или вызоваДелегат ConstructorInfo
будет работать так же быстро, как и любой другой объект.
Если вы получаете объект, загружая сборку динамически, используя отражение, чтобы найти вызываемый метод, и вызываете его, и он реализуетопределенный интерфейс, через который вы вызываете его с этого момента, тогда он будет таким же быстрым в использовании, как и другая реализация этого интерфейса.
В общем, отражение дает нам способы делать вещи, которые безесли бы мы могли - если бы вообще могли их делать - должны использовать методы, более медленные как для кода, так и для выполнения.
Это также дает нам средства для выполненияБолее сложные, более хрупкие, менее типичные и менее производительные вещи, чем другие.Практически каждая строка кода C # может быть заменена большим фрагментом кода, который использует отражение.Этот код почти наверняка будет хуже, чем исходная строка в целом ряде способов, и производительность является наименьшим из них.
Вполне возможно, что «избегать отражения, потому что его медленный» совет вытекает из убеждения, что сортировкаразработчика, который сходил бы с ума от любой новой техники только потому, что она казалась крутой, и скорее всего ее предупредят слова «это будет медленнее», чем «она будет менее идиоматичной, более подверженной ошибкам и более сложной»поддерживать".Вполне возможно, что это убеждение является полностью правильным.
По большей части, хотя, когда наиболее естественным и очевидным подходом является использование отражения, оно также не будет менее производительным, чем действительно запутанная попытка избежать его.
Если проблемы с производительностью относятся к чему-либо в отражении, то это действительно относится к скрытому использованию:
Использование dynamic
может показаться разумным в случае, когда этого может избежать лишь небольшая работа.Здесь стоит учитывать разницу в производительности.
В ASP.NET использование <%#DataBinder.Eval(Container.DataItem, "SomeProperty")%>
проще, но обычно менее производительно, чем <#((SomeType)Container.DataItem).SomeProperty%>
или <%#SomeCodeBehindProvidedCallWithTheSameResult%>
.Я по-прежнему буду использовать первые 90% времени, а последние только в том случае, если я действительно забочусь о производительности данной страницы или, скорее всего, потому что выполнение многих операций над одним и тем же объектом делает последний на самом деле более естественным.
Таким образом, в целом все остается «медленным» в компьютерах, в то время как они ограничены требованием работать в единой вселенной таким образом, чтобы потреблять энергию и занимать время, для некоторого значения «медленного».Различные методы отражения имеют разные затраты, но и альтернативы тоже.Остерегайтесь не столько рефлексии в тех случаях, когда это очевидный подход, но и скрытый рефлекс, когда другой подход, чуть менее очевидный, может быть полезен.
И, конечно, разумно кодировать с использованием любой техники, которую вы используете.Если вы собираетесь вызывать один и тот же делегат сто раз подряд, вы должны хранить его, а не получать его при каждом вызове, и это будет зависеть от того, был ли путь его получения с помощью отражения или нет.