Во-первых, единственный способ ответить на вопросы о производительности - это попробовать оба способа и проверить результаты в реальных условиях.
Тем не менее, другие ответы, в которых говорится, что «компилятор» не выполняет эту оптимизацию, поскольку свойство может иметь побочные эффекты, являются как правильными, так и неправильными. Проблема с вопросом (помимо фундаментальной проблемы, на которую просто невозможно ответить, не пытаясь на самом деле это сделать и не измерив результат), заключается в том, что «компилятор» - это на самом деле два компилятора: компилятор C #, который компилируется в MSIL, и компилятор JIT , который компилирует IL в машинный код.
Компилятор C # никогда не выполняет такую оптимизацию; как уже отмечалось, для этого потребуется, чтобы компилятор вглядывался в вызываемый код и проверял, что результат, который он вычисляет, не изменяется в течение времени жизни кода вызываемого. Компилятор C # этого не делает.
Компилятор JIT может. Нет причин, почему это не могло. Там есть весь код. Встроенный метод получения свойства полностью свободен, и если джиттер определяет, что встроенный метод получения свойства возвращает значение, которое можно кэшировать в регистре и использовать повторно, тогда он может сделать это бесплатно. (Если вы не хотите, чтобы это делалось, поскольку значение могло быть изменено в другом потоке, у вас уже есть ошибка условия гонки; исправьте ошибку, прежде чем беспокоиться о производительности.)
Является ли на самом деле джиттер встроенным извлечением свойства и затем регистрирует значение, я понятия не имею. Я практически ничего не знаю о джиттере. Но это разрешено делать, если сочтет нужным. Если вам интересно узнать, так ли это или нет, вы можете (1) спросить кого-то из команды, написавшей джиттер, или (2) проверить код в коде отладчика.
И, наконец, позвольте мне воспользоваться этой возможностью, чтобы отметить, что вычисление результатов один раз, сохранение результата и его повторное использование не всегда является оптимизацией . Это удивительно сложный вопрос. Есть множество вещей для оптимизации:
время исполнения
размер исполняемого кода - это существенно влияет на время выполнения, поскольку загрузка большого кода занимает больше времени, увеличивает размер рабочего набора, оказывает давление на кэш-память процессора, ОЗУ и файл подкачки. Небольшой медленный код часто в долгосрочной перспективе быстрее , чем большой быстрый код в важных показателях, таких как время запуска и локальность кэша.
распределение регистров - это также существенно влияет на время выполнения, особенно в архитектурах, таких как x86, которые имеют небольшое количество доступных регистров. Регистрация значения для быстрого повторного использования может означать, что для других операций, требующих оптимизации, доступно меньше регистров. возможно, вместо оптимизации этих операций будет чистый выигрыш.
и так далее. Это очень сложно очень быстро.
Короче говоря, вы не можете знать, является ли запись кода для кэширования результата, а не перерасчет, на самом деле (1) быстрее или (2) более эффективной. Повышение производительности не всегда означает ускорение выполнения конкретной подпрограммы. Повышение производительности - это выяснение того, какие ресурсы важны для пользователя - время выполнения, память, рабочий набор, время запуска и т. Д. - - и оптимизировать для этих вещей. Вы не можете сделать это без (1) разговора с вашими клиентами, чтобы выяснить, о чем они заботятся, и (2) фактического измерения, чтобы увидеть, оказывают ли ваши изменения ощутимый эффект в желаемом направлении.