Создание локальных переменных в .Net - PullRequest
4 голосов
/ 15 марта 2009

Я просто хочу знать, что создание локальных переменных для принятия возвращаемого значения функции повлияет на использование памяти или производительность в приложениях .Net, особенно в ASP.Net.

говорят

 MyObject myObject = Foo();
 MyOtherObject myOtherObject = Boo();

 SomeFuntion(myObject, myOtherObject);

OR

Должен ли я использовать

 MyFunction(Foo(), Boo());

Конечно, первое использование лучше читается. Но как насчет использования памяти и производительности?

Заранее спасибо 123Developer

Ответы [ 4 ]

15 голосов
/ 15 марта 2009

Не оптимизируйте преждевременно; в сборке релиза вполне вероятно, что компилятор все равно их оптимизирует! В любом случае, вы просто говорите о небольшом количестве стекового пространства (предположительно) для нескольких ссылок. Любой подход хорош; идти с тем, что является более читабельным.

5 голосов
/ 15 марта 2009

CIL (промежуточный язык, на котором компилируется C #) - это язык на основе стека, поэтому возвращаемые значения промежуточных функций должны заканчиваться в стеке, прежде чем они будут переданы в качестве аргументов для окончательного варианта.

Нет способа предсказать, что будет делать компилятор C # [1] в терминах локальных данных; он может решить использовать локальные ресурсы, когда вы это делаете, или он может использовать поведение стека и вообще пропустить их. Точно так же он может синтезировать местных жителей, даже если вы их не используете, или нет.

В любом случае, не стоит беспокоиться о разнице в производительности.


[1] Да, конечно, вы можете скомпилировать и посмотреть на IL, который он генерирует, чтобы определить, что он будет делать, но это действительно только для текущей версии используемого вами компилятора. и это деталь реализации, на которую не следует полагаться.

2 голосов
/ 15 марта 2009

Я считаю, что производительность памяти была бы по существу такой же. И если тестирование производительности не показало существенных различий, выберите вариант с повышенной удобочитаемостью.

0 голосов
/ 16 марта 2009

Не бойтесь использовать локальные переменные. Разница в использовании памяти и производительности очень мала, а в некоторых случаях вообще отсутствует.

В вашем конкретном случае локальные переменные могут использовать 8 байт (16 байт в 64-битном приложении) стекового пространства. Однако компилятор может создавать локальные переменные самостоятельно, если это необходимо для временного хранения, поэтому возможно, что обе версии в любом случае имеют одинаковый набор локальных переменных.

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

Выделение стекового пространства в любом случае очень дешево. Когда метод вызывается, для локальных данных в методе создается кадр стека. Если будет выделено больше памяти, это только изменит то, насколько сильно перемещен указатель стека, это вообще не даст никакого дополнительного кода.

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

...