Разница в производительности между возвратом значения напрямую или созданием временной переменной
Есть ли разница в производительности или потреблении памяти при создании временной переменной в функции по сравнению с возвратом непосредственно значения, присвоенного этой переменной?
Например, какая из этих функций (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% своего времени на отладку.