Полезная абстракция для эффективности кода состоит в том, чтобы разделить его на три категории времени, каждая на расстоянии порядка 3 порядков.
Первый - это время человека.Вы можете многое сделать, если вам нужно только, чтобы человек был доволен производительностью вашего кода.Люди не могут почувствовать разницу между кодом, который требует 10 миллисекунд или 20 миллисекунд, оба выглядят мгновенно.И человек прощает, когда программе нужно 6 секунд вместо 5, что примерно на 3 миллиарда машинных инструкций больше.Типичными примерами программ, запускаемых человеком, являются компиляторы и дизайнеры «укажи и щелкни».Использование отражения никогда не является проблемой.
Тогда есть время ввода-вывода.Когда ваша программа должна попасть на диск или в сеть.Ввод / вывод медленный, ограничен механическим движением в случае диска, пропускной способностью и задержкой в случае сети.Вы всегда можете сказать, когда узким местом является I / O, ваша программа работает, но не сильно увеличивает нагрузку на процессор.Операционная система постоянно блокирует поток, заставляя его ждать завершения запроса ввода-вывода.
Отражение работает во время ввода-вывода.Чтобы получить данные типа, CLR должен прочитать метаданные сборки.А когда этого не было сделано раньше, ваша программа вызовет сбой страницы, требующий от операционной системы считывания данных с диска.Далее следует, что, примерно, отражение может сделать код, связанный с вводом / выводом, только в два раза медленнее.Обычно лучше, потому что после первого попадания метаданные кэшируются и могут быть получены намного быстрее.Поэтому отражение часто является приемлемым компромиссом.Каноническими примерами являются сериализация и базы данных ORM.
Тогда есть время машины.Необработанная производительность ядра ЦП огромна.Получатель свойства может выполняться где-то между 0 и 1/2 a наносекунда .Это не выгодно отличается, скажем, от PropertyInfo.GetValue ().Оба будут загружать процессор, вы увидите, что загрузка процессора для ядра составляет 100%.Но GetValue () стоит сотни, если не тысячи инструкций машинного кода.Не считая времени, необходимого для страницы в метаданных.Несмотря на то, что это время не является инкрементным, оно быстро растет при цикле.
Если вы не можете классифицировать свой код отражения по категориям человеческого времени или времени ввода-вывода, то отражение вряд ли будет подходящей заменойобычный код.