(Почему) Отражение настолько дорогое в .Net?
Возможный дубликат:
Какова "стоимость" отражения?
Есть ли у кого-нибудь хорошее объяснение общепринятой мантры, что reflection == bad performance
?
Например, насколько дорого стоит перебирать коллекцию свойств типа и извлекать все значения свойств из экземпляра этого типа по сравнению с просто доступом ко всем свойствам напрямую? Один уровень величины? Два? От чего это зависит? Предсказуемо ли вообще? Что происходит под капотом?
EDIT: Спасибо за ответы. Я просмотрел некоторые ссылки, которые вы предоставили, и кажется, что существует огромный пробел в оценках Reflection on Properties по сравнению с прямым доступом: от 2,5 раза медленнее до 200 раз медленнее.
Мне это не кажется разумным. Некоторые из вас упомянули улучшения производительности в более поздних версиях .Net, поэтому позвольте мне сузить мой вопрос до .Net 4.0. Есть ли у кого-нибудь тесты для этого?
Ответы
Ответ 1
Лучший ответ: общепринятая мантра не так проста, как кажется. reflection == bad performance
в значительной степени исходит из .NET 1.0 и 1.1 и не может подтвердить улучшения производительности в более поздних версиях.
Чтобы быть объективным, я неоднократно тестировал решения на основе отражения в сравнении с решениями, не основанными на отражении, и победитель не всегда был одним или другим. Отражение - это то, что есть, и оно работает, как оно работает, оно не всегда быстрее или медленнее, и оно (как и в основном с любыми подходами к программированию) нельзя рассматривать как серебряную пулю или как-то всегда избегать.
Ответ 2
Кто заботится о том, что думают другие люди? Если вы провели тщательное расследование ваших вариантов (включая другие подходы, которые не требуют метода, который вы изучаете), и обнаружили, что это правильный вариант, а затем используйте его.
http://www.parashift.com/c++-faq-lite/big-picture.html#faq-6.16
Что касается "того, что происходит под капотом", у вас, похоже, есть часть картины. Существует также тот факт, что ни одна из ссылок не жестко закодирована, все это нужно искать во время выполнения. Это означает, что невозможность встраивания невозможна, ошибки компилятора не создаются, если вы ошибаетесь в имени участника, и все члены должны быть просмотрены с использованием строки, при этом любая связанная строка сравнивает первичные удары (которые могут или не могут существовать, в зависимости от материала например, интернирование строк и т.д.).
Edit:
Ну, я думаю, эта последняя часть моего ответа не обязательно правильна. Это во многом зависит от того, как вы используете отражения. Профиль! И если вы придумаете альтернативное решение, профайл тоже.:)
Ответ 3
На SO есть несколько вопросов, которые отвечают на это различными способами.
Здесь хороший IMO: Что такое "стоимость" ? отражения .NET?
Одна из статей ссылок на ответчик дает некоторую интересную информацию о том, что некоторые функции отражения являются более дорогостоящими, чем другие. Например, делать typeof не так уж плохо, но методы вызова более дорогостоящие.
Ответ 4
Есть несколько вещей, которые вы просто не можете сделать со статически. Используйте отражение, когда оно вам нужно. Вы, вероятно, уже используете его больше, чем вы понимаете.
Я провел много тестов производительности и измерений для отражения против статических операций. У отражения больше работы, и он всегда медленнее. Но все в порядке. "Медленнее" не означает "медленный", это просто означает "не так быстро". Вот как это следует учитывать. Отражение может быть быстрым, но не так быстро, как статическая операция. Из-за этого его не следует автоматически избегать.
Я работал на ведущих разработчиков, которые абсолютно запретили какой-либо отражающий код в веб-проекте, потому что он будет медленным. Но ему никогда не казалось, что мы используем привязку данных NHibernate, ASP.NET и ASP.NET MVC, все из которых работают почти исключительно с привязкой к отражающим данным.
Это отвращение к размышлению было иррациональным и необоснованным. Я думаю, что так обстоит дело с большим количеством людей, с которыми вы общаетесь.
Ответ 5
В отношении отражения есть много неправильного представления.
Этот парень показал, что отражение занимает примерно в 3 раза дольше, чем прямое назначение. В действительности эта функция, используемая правильно, не окажет заметного влияния на производительность. Нет ничего плохого в использовании отражений в правильном контексте.