Оптимизация свойства get для ValueType - PullRequest
0 голосов
/ 29 июня 2011

У меня есть иерархическая структура классов, подобных этой

public class Class1
{
    internal DateTime time = DateTime.Now;
}

public class Class2
{
    internal Class1 C1;

    public Class2(Class1 c1) { C1 = c1; }

    public DateTime Time { get { return C1.time; } }
}

public class Class3
{
    internal Class2 C2;

    public Class3(Class2 c2) { C2 = c2; }

    public DateTime Time { get { return C2.Time; } }
}

public class Class4
{
    internal Class3 C3;

    public Class4(Class3 c3) { C3 = c3; }

    public DateTime Time { get { return C3.Time; } }
}

Интересно, когда я позвоню

Class4 C4 = new Class4(.....);  
Console.WriteLine(C4.Time);

Будет ли данные ValueType (в данном случае это DateTime) скопированы 4 раза или компилятор JIT оптимизирует код и сгенерирует его как встроенную версию, такую ​​как C4.C3.C2.C1.time;

Компилятор C # не выполняет никакой оптимизации. Сгенерированный ILDASM код находится здесь:

// get { return C3.Time; }
.method public hidebysig specialname instance valuetype [mscorlib]System.DateTime 
        get_Time() cil managed
{
  // Code size       12 (0xc)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldfld      class CSTester.Class3 CSTester.Class4::C3
  IL_0006:  callvirt   instance valuetype [mscorlib]System.DateTime CSTester.Class3::get_Time()
  IL_000b:  ret
} // end of method Class4::get_Time

// get { return C2.Time; }
.method public hidebysig specialname instance valuetype [mscorlib]System.DateTime 
        get_Time() cil managed
{
  // Code size       12 (0xc)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldfld      class CSTester.Class2 CSTester.Class3::C2
  IL_0006:  callvirt   instance valuetype [mscorlib]System.DateTime CSTester.Class2::get_Time()
  IL_000b:  ret
} // end of method Class3::get_Time

РЕДАКТИРОВАТЬ: код компилируется в режиме выпуска с включенной оптимизацией.

Ответы [ 2 ]

3 голосов
/ 29 июня 2011

Может быть, так и будет. Возможно это не будет Может быть, это будет на некоторых версиях CLR, на некоторых архитектурах ЦП, но не на других.

Вопрос, который вы должны задать себе, - насколько это действительно важно.

Есть ли у вас целевые показатели и показатели?

Ваш код соответствует им?

Если это не так, есть ли у вас основания полагать, что это узкое место?

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

2 голосов
/ 29 июня 2011

Эрик Липперт говорит, что я не знаю гораздо красноречивее менямне, но было бы небезопасно полагаться на это.Копирование 24 байтов не стоит беспокоиться.Если это так, возможно, для этой части кода следует использовать язык более низкого поколения.

...