Отражение производительности во время выполнения - Java против CLR

Связанный пост здесь в значительной степени установил отражение в Java как средство снижения производительности. Это относится и к CLR? (C#, VB.NET и т. д.).

РЕДАКТИРОВАТЬ: Чем отличается CLR от Java, когда дело касается отражения? Это когда-нибудь проверялось?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
2 032
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Да, отражение в .NET также требует высокой производительности, поскольку требует запросов к таблицам метаданных в сборках.

Это все еще верно даже после загрузки сборок в память?

Otávio Décio 13.01.2009 22:25

Да. Динамическое разрешение типов и членов по имени требует их поиска в системе типов, что явно медленнее, чем статическое разрешение.

mmx 13.01.2009 22:27

Да, это так, потому что, даже если сборки находятся в памяти, вы все равно должны просматривать таблицы метаданных, которые являются медленной частью.

Andrew Hare 13.01.2009 22:27

Также ... как CLR сравнивается с Java, когда дело доходит до отражения?

Otávio Décio 13.01.2009 22:28

Очень легко увидеть, что это НАМНОГО медленнее по простому фрагменту кода. Подобно тому, который вы связали для Java. Однако это действительно зависит от времени выполнения. Вы должны провести сравнительный анализ с конкретной версией среды выполнения Java и среды выполнения .NET.

mmx 13.01.2009 22:30

Реализация Equals по умолчанию для типов значений реализована с помощью Reflection. Это работает, но чертовски медленно, и легко реализовать конкретную версию, которая намного быстрее (загвоздка в том, что вам также нужно реализовать GetHashCode). Насколько быстрее, конечно, зависит от фактического типа значения, но я видел здесь несколько огромных приростов.

Ответ принят как подходящий

Меня бы не волновала производительность создания экземпляра объекта с использованием самого отражения, а фактическая производительность методов и тому подобное, поскольку это, в конце концов, то, что я в любом случае буду использовать из класса.

Конечно, создание экземпляра занимает много времени, как можно увидеть в связанной публикации, но поскольку вы, скорее всего, используете методы объекта вместо того, чтобы просто создавать его экземпляр, вам не следует слишком беспокоиться о производительности отражения - пока вы не выполнять вызовы методов, вызывая отраженные объекты Method!

Кроме того, вам нужен только один отраженный экземпляр объекта, используйте .clone() и другие хитрые приемы, если вам нужно создать больше копий.

Что, если вы используете отражение как часть своей логики - не обязательно инстанциируя что-либо, но используя определение типа в качестве руководства - своего рода «метапрограммирование»?

Otávio Décio 13.01.2009 22:53

Если вы не создаете экземпляры объектов, зачем вам все равно отражать их (части)? Мне было бы интересно увидеть пример того, что вы имеете в виду, если у вас есть время, пожалуйста, объясните более подробно.

Esko 13.01.2009 22:55

Предположим, у вас есть список объектов и вы хотите изменить их значения. С помощью отражения вы можете создать единый пользовательский интерфейс, который позволит вам это сделать. Вы можете определить атрибуты для меток, максимальный размер и т. д.

Otávio Décio 13.01.2009 22:57

Ах, верный случай такого поведения, и теперь я понимаю, о чем вы. Да, это, к сожалению, медленно, но если я правильно помню (здесь немного туманно), можно создать прокси-объект, используя java.lang.reflect.Proxy для ускорения такой функциональности, повторно используя прокси для каждого объекта в списке.

Esko 13.01.2009 23:05

Я понимаю, что в Java это медленно, но мне любопытно, применимо ли то же самое к C#.

Otávio Décio 13.01.2009 23:08

Другие вопросы по теме