2011-01-20 5 views
7

Позволяет сравнить два фрагмента кода:Выполняет ли инициализация локальной переменной с нулевым воздействием?

String str = null; 
//Possibly do something... 
str = "Test"; 
Console.WriteLine(str); 

и

String str; 
//Possibly do something... 
str = "Test"; 
Console.WriteLine(str); 

Я всегда думал, что эти куски кода равны. Но после того как я построить этот код (режим Release с оптимизацией проверяемым) и по сравнению методов IL сгенерировано я заметил, что есть еще две команды IL в первом образце:

первого образец код IL:

.maxstack 1
.locals INIT ([0] строка Str)
IL_0000: ldnull
IL_0001: stloc.0
IL_0002: ldstr "Test"
IL_0007: stloc.0
IL_0008: ldloc.0
IL_0009: вызов недействительным [mscorlib] System.Console :: WriteLine (строка)
IL_000e: RET

второй образец кода IL:

.maxstack 1
.locals инициализации ([0] строка ул)
IL_0000: ldstr "Тест"
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: Зов пустота [mscorlib] System.Console :: WriteLine (строка)
IL_000c: RET

Возможно, этот код оптимизирован компилятором JIT? Итак, инициализация локальной переменной bethod с нулевым воздействием влияет на работу (я понимаю, что это очень простая операция, но в любом случае), и мы должны ее избегать? Спасибо заранее.

+4

Обычно считается ошибочной формой для инициализации со значением, которое никогда не будет использоваться, просто потому, что оно добавляет путаницу (назначается «нуль», не имеющий смысла для логики). Любое связанное с этим поражение производительности незначительно; прежняя причина - гораздо более веская причина, чтобы избежать этого. –

+0

@ Dan Bryany: Спасибо за комментарий. Я согласен с вами в том, что мы не должны использовать null для инициализации, но некоторые разработчики предпочитают использовать его для непосредственной инициализации. У меня есть такая в моей команде :) –

+4

Обычно я предпочитаю не объявлять переменную до тех пор, пока она не будет инициализирована, поскольку это еще больше ограничивает концептуальную область при попытке понять код (т.е. местные жители максимально локальны там, где они находятся используется.) Побочным эффектом этого подхода является то, что по мере роста метода размещение местных жителей имеет тенденцию выделять области кода, в которых могут быть извлечены новые методы. –

ответ

7

http://www.codinghorror.com/blog/2005/07/for-best-results-dont-initialize-variables.html

Подводя итог из статьи, после запуска различных тестов, инициализации объекта до значения (либо как часть определения, в классе конструктора, или в качестве части способа инициализации) может быть где-то примерно на 10-35% медленнее на .NET 1.1 и 2.0. Новые компиляторы могут оптимизировать инициализацию при определении. Статья закрывается рекомендацией избегать инициализации как общего правила.

6

Это немного медленнее, так как ссылка Jon.Stromer.Galley указывает. Но разница удивительно мала; вероятно, порядка наносекунды. На этом уровне накладные расходы от использования языка высокого уровня, такого как C#, затмевают любую разницу в производительности. Если производительность является большой проблемой, вы можете также кодировать в C или ASM или что-то еще.

Значение написания четкого кода (что бы это ни значило для вас) значительно перевешивает увеличение производительности на 0,00001 мс с точки зрения стоимости и выгоды. Вот почему C# и другие языки высокого уровня существуют в первую очередь.

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

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

  • Нет связанных вопросов^_^