Рид Копси сказал , указав значения по умолчанию для полей, влияющих на производительность, и он ссылается на тест 2005 года .
public class A
{
// Use CLR's default value
private int varA;
private string varB;
private DataSet varC;
}
public class B
{
// Specify default value explicitly
private int varA = 0;
private string varB = null;
private DataSet varC = null;
}
Теперь, спустя восемь лет и четыре версии C # и .NET, позже я решил повторить этот тест под .NET Framework 4.5 и C # 5, скомпилированный как Release с оптимизацией по умолчанию с помощью Visual Studio 2012. Я был удивлен, увидев, что все еще есть разница в производительности между явной инициализацией полей их значениями по умолчанию и отсутствием указания значения по умолчанию. Я бы ожидал, что более поздние компиляторы C # уже оптимизируют эти константы.
No init: 512,75 Init on Def: 536,96 Init in Const: 720,50
Method No init: 140,11 Method Init on Def: 166,86
( остальные )
Итак, я заглянул внутрь конструкторов классов A
и B
в этом тесте, и оба пусты:
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method .ctor
Я мог бы не найти причину в IL, почему явное назначение значений констант по умолчанию для полей потребовало бы больше времени. По-видимому, компилятор C # действительно оптимизирует константы, и я подозреваю, что так было всегда.
Итак, тогда тест должен быть неправильным ... Я поменял местами классы A
и B
, поменял числа в строке результата и перезапустил тесты. И о чудо теперь внезапно задание значений по умолчанию быстрее .
No init: 474,75 Init on Def: 464,42 Init in Const: 715,49
Method No init: 141,60 Method Init on Def: 171,78
( остальные )
Поэтому я делаю вывод, что компилятор C # правильно оптимизирует для случая, когда вы назначаете значения по умолчанию для полей. Нет никакой разницы в производительности!
Теперь мы знаем, что производительность действительно , а не проблема. И я не согласен с заявлением Рида Копси"" Дополнительный "код, даже если он безвреден, предполагает, что он существует по причине, которая снижает удобство обслуживания. ", и согласен с Андерс Ханссон на это:
Подумайте о долгосрочном обслуживании.
- Сохраняйте код как можно более явным.
- Не полагайтесь на специфичные для языка способы инициализации, если это не нужно. Может быть, более новая версия языка будет работать по-другому?
- Будущие программисты будут вам благодарны.
- Менеджмент поблагодарит вас.
- Зачем запутывать вещи даже малейшим?
Будущие сопровождающие могут прийти из другого фона. Дело не в том, что «правильно», а в том, что будет легче в долгосрочной перспективе.