В этом примере нет никакого смысла. Вероятность JIT, не входящая в простой get
, очень низкая. Даже если get
не вложен, дополнительный вызов функции не будет вашим узким местом производительности за пределами очень простого кода.
Чтобы показать, что я имею в виду, я запустил следующее в режиме Release (если вы оставите его в отладке, он будет работать по-другому).
private int Length { get; set; }
private int _length;
void Run()
{
Length = int.MaxValue;
_length = int.MaxValue;
var watch = new Stopwatch();
watch.Start();
for (int i = 0; i < Length; i++)
{
}
watch.Stop();
Console.WriteLine("Elapsed: {0}ms", watch.ElapsedMilliseconds);
watch.Restart();
for (int i = 0; i < _length; i++)
{
}
watch.Stop();
Console.WriteLine("Elapsed: {0}ms", watch.ElapsedMilliseconds);
}
Я побежал в 10 раз и получил следующие средние: 743 мс для собственности, 740 мс для переменной. Это различие, вероятно, связано только с небольшим количеством попыток и других вещей, которые происходят на моей машине.
Теперь, если вы отключите вложение с помощью атрибута, вы получите разницу во времени: 4577 мс для свойства и 775 мс для переменной. Теперь это звучит как огромная разница (всего 6 раз больше времени), но помните о моем состоянии цикла: 2 миллиарда итераций. Это означает, что разница была чем-то вроде 2 нс за операцию. Другими словами, около 4 тактов, которых недостаточно, чтобы волноваться во всех, кроме самых экстремальных сценариях производительности.
Вы оценили, что свойство приводит к потере производительности? 'get'ter обычно достаточно просты, чтобы быть встроенным компилятором JIT, поэтому разница между полем и свойством не будет. – dtb
Работа: стирание памяти с использованием байта * с циклом for. Использование переменной из объекта = X ms. Использование свойства = 2 * X ms. Таким образом, свойство намного медленнее. Когда я копирую Length в локальную переменную (из переменной объекта), она дает еще 10% скорости. Поэтому, наконец, я использую свойство Length, а затем скопирую его значение в локальную переменную перед каждым циклом. Конечно, когда я использую long * для очистки этой памяти, будет еще более полезно скопировать длину в локальную переменную. Поэтому я решил это. – zgnilec