2014-01-14 3 views
5

Ну, в соответствии с некоторыми ответами на вопросы о переполнении стека, я прочитал, что использование объявления объекта внутри цикла лучше, чем выполнение его вне его, с одновременной работой.Объявление переменной типа в производительности бесконечного цикла?

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

while (true) { 
    String hey = "Hello."; 
} 

Ram: 1820kb

String hey; 
while (true) { 
    hey = "Hello."; 
} 

использование Ram: 1720kb

Почему люди говорят, что я должен использовать первый цикл вызвать его лучше для производительности, но он использует 100kb больше от барана ?

+4

Я думаю, вы проверяете использование памяти с помощью диспетчера задач, используйте [Профили памяти] (http://stackoverflow.com/questions/3927/what-are-some-good-net-profilers) и не полагайтесь на диспетчере задач – Habib

+5

Они говорят так, потому что ваши измерения почти наверняка неверны :-) – dasblinkenlight

+2

Первое правило измерения: вы не измеряете то, что, по вашему мнению, вы измеряете. Второе правило измерения: см. 1-е правило. – elgonzo

ответ

6

При запуске кода в режиме выпуска в .NET эти две части кода идентичны из-за метода оптимизации компилятора, который называется loop invariant code motion. В оптимизаторе JIT существует огромное количество интеллектуальных методов оптимизации, которые будут «исправлять» ваш код. Поэтому вы должны в принципе поддерживать читаемость/простоту в коде над чем-либо еще.

+0

Спасибо! Я знаю об этой оптимизации, но я действительно не знал ее имени. – elgonzo

5

Нет абсолютно никакой разницы между двумя вариантами. Они скомпилированы в идентичный код IL.

1

С точки зрения разработчика в стороне, компилятор является единственным, кто заботится. Если вы помещаете декларацию внутри блока, вы можете упростить компилятор с распределением реестра, потому что более очевидно, какова область использования переменной. Но эй, компиляторы сегодня сообразительны, и вы не имели бы большого значения (см. Движение цикла с инвариантным кодом, упомянутое @Bas Brekelmans).

Вы не можете полагаться на простые измерения, как это предлагается в комментариях. Если действительно существует детерминированная разница между использованием ОЗУ, я предполагаю, что компилятор принимает другое решение где-то для двух версий, он работает эвристически в любом случае.

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

Смежные вопросы