Разница в производительности между возвратом значения напрямую или созданием временной переменной

Есть ли разница в производительности или потреблении памяти при создании временной переменной в функции по сравнению с возвратом непосредственно значения, присвоенного этой переменной?

Например, какая из этих функций (GetValue) лучше в производительности и для экономии памяти, или оба они одинаковы:

Случай 1:

  private string GetValue()
  {
     return this.GetResult();
  }

  private string GetResult()
  {
     // Code here that return a big string...
  }

Случай 2:

  private string GetValue()
  {
     string result = this.GetResult();

     return result;
  }

  private string GetResult()
  {
     // Code here that return a big string...
  }

Спасибо.

Ответ 1

В этих основных ситуациях читаемость всегда превосходит разницу в производительности. В лучшем случае я считаю это микро-оптимизацией, и это в значительной степени оказывается ненужным временем. То, что вы сэкономите на этом, будет съедено путем неопределенного запуска GC.

В большинстве случаев нет различий в результирующем коде, если компилятору разрешено его оптимизировать. Получившийся IL в этом случае, по-видимому, содержит несколько дополнительных op-кодов для ссылки на строку в стеке, но то, что JIT делает с этим, все догадываются.

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

Ответ 2

Если локальная переменная фактически используется исполняемым кодом и не выбрана, то разница все еще минимальна.

Локальная переменная использует только пространство стека, необходимое для хранения ссылки, и выделение пространства для него не требует никакого времени, поскольку кадр стека всегда всегда выделяется.

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

Ответ 3

Локальная переменная всегда оптимизируется.

Нет влияния на производительность использования локальной переменной перед оператором возврата.

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

Я предпочитаю использовать локальную переменную всегда, так как это ускоряет отладку. Согласно этому, разработчики тратят 75% своего времени на отладку.