Usando propriedades e desempenho
Eu estava otimizando meu código e percebi que o uso de propriedades (mesmo propriedades automáticas) tem um impacto profundo no tempo de execução. Veja o exemplo abaixo:
[Test]
public void GetterVsField()
{
PropertyTest propertyTest = new PropertyTest();
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
propertyTest.LoopUsingCopy();
Console.WriteLine("Using copy: " + stopwatch.ElapsedMilliseconds / 1000.0);
stopwatch.Restart();
propertyTest.LoopUsingGetter();
Console.WriteLine("Using getter: " + stopwatch.ElapsedMilliseconds / 1000.0);
stopwatch.Restart();
propertyTest.LoopUsingField();
Console.WriteLine("Using field: " + stopwatch.ElapsedMilliseconds / 1000.0);
}
public class PropertyTest
{
public PropertyTest()
{
NumRepet = 100000000;
_numRepet = NumRepet;
}
int NumRepet { get; set; }
private int _numRepet;
public int LoopUsingGetter()
{
int dummy = 314;
for (int i = 0; i < NumRepet; i++)
{
dummy++;
}
return dummy;
}
public int LoopUsingCopy()
{
int numRepetCopy = NumRepet;
int dummy = 314;
for (int i = 0; i < numRepetCopy; i++)
{
dummy++;
}
return dummy;
}
public int LoopUsingField()
{
int dummy = 314;
for (int i = 0; i < _numRepet; i++)
{
dummy++;
}
return dummy;
}
}
NoRelease
modo na minha máquina, recebo:
Using copy: 0.029
Using getter: 0.054
Using field: 0.026
que, no meu caso, é um desastre - o loop mais crítico simplesmente não pode usar nenhuma propriedade se eu quiser obter o máximo desempenho.
O que eu estou fazendo errado aqui? Eu estava pensando que estes seriaminlined
peloJIT optimizer
.