Увеличивает ли добавление операторов возврата для методов С#?

Этот blog говорит

12) Включить возвращаемые выражения с помощью функции/метода. Как это улучшает производительность Явное использование return позволяет JIT выполнять несколько больше оптимизаций. Без оператора return каждой функции /method дается несколько локальных переменных в стеке, чтобы прозрачно поддерживать возвращаемые значения без ключевого слова. Сохранение этих параметров затрудняет оптимизацию JIT и может повлиять на производительность вашего кода. Просмотрите свои функции/методы и вставьте возврат по мере необходимости. Он не изменяет семантику кода вообще, и он может помочь вам получить больше скорости от вашего приложения.

Я уверен, что это ложное утверждение. Но хотел получить мнение экспертов. Что вы, ребята, думаете?

Ответы

Ответ 1

Этот оператор не относится к С#.

С С# вы должны явно установить "return", чтобы иметь допустимую функцию, без возврата, вы получаете ошибку компиляции в результате того, что "не все пути кода возвращают значение".

С VB.NET это применимо, поскольку VB.NET НЕ имеет требования к явному возврату и позволяет вам иметь функции, которые никогда не возвращают значение, а также позволяют вам устанавливать возврат с использованием имени функция.

Чтобы предоставить пример

В VB.NET вы можете сделать это

Function myFunction() As String
    myFunction = "MyValue"
End Function

Function myFunction2() As String
    'Your code here
End Function

Вышеприведенные компиляции, ни с явным "возвратом", в этом есть больше накладных расходов.

Если вы попытаетесь сделать это с помощью С#

string myFunction()
{
    //Error due to "Cannot assign to 'myFunction' because it is a 'Method Group'
    myFunction = "test";
}

string myFunction2()
{
    //Error due to "not all code paths return a value
}

В моих комментариях учтены ошибки, которые вы получаете.

Ответ 2

Сообщение довольно неопределенное. Будучи разработчиком С#, моя первая мысль была "в отличие от чего?". Однако он может ссылаться на что-то вроде:

public bool MyFunction()
{
    bool result = false;
    if (someCondition == true)
    {
        // Do some processing
        result = true;
    }
    else if (someOtherCondition == true)
    {
       // Do some processing
       result = true;
    }
    // ... keep going

    return result;
}

Он может предположить, что замена операторов result = true; на return true; может работать лучше. Я не уверен в этом лично... это довольно глубоко в теории JIT в этот момент, и я думаю, что любые достижения, которые были сделаны, будут очень незначительными по сравнению с другими улучшениями производительности, которые вы могли бы сделать.

Ответ 3

Я бы не согласился - я думаю, что один сингл и один из каждого метода упрощают чтение и отладку кода. Несколько операторов return в функции могут сделать навигационный код более comlpex. Фактически (если возможно, рефакторинг) лучше иметь более мелкие функции, чем сказать большие функции с несколькими выходами.

Ответ 4

Это несколько верно, как для VB.NET, так и для С#. В С# программист должен объявить переменную, которая содержит возвращаемое значение явно, она является автоматической в ​​VB.NET. Большинство возвращаемых значений возвращаются в регистре EAX или RAX, компилятор JIT должен генерировать код для загрузки регистра из переменной возвращаемого значения до выхода функции. Когда вы используете оператор return, компилятор JIT может иметь возможность загрузить регистр EAX напрямую или уже иметь регистр, содержащий правильное значение, и перейти к коду выхода функции, минуя команду load-from-variable.

Что довольно большой "может" btw, настоящий код неизменно проверяет некоторое выражение с помощью оператора if(). Оценка этого выражения почти всегда связана с использованием регистра EAX, его все равно нужно перезагрузить с возвращаемым значением. Компилятор x64 JIT выполняет совершенно другую работу, выполняющую это по сравнению с компилятором x86, последнее всегда, кажется, использует переменную в нескольких выборочных проверках, которые я делал. Таким образом, вы вряд ли будете впереди, если не используете 64-разрядную версию Windows.

Из всего зла в преждевременной оптимизации это, возможно, самое худшее. Потенциальная экономия времени минимальна, сначала напишите свой код для ясности. Профиль позже.

Ответ 5

Мое единственное предположение, что он говорит о VB.NET, а не о С#. VB.NET позволяет вам что-то вроде этого возвращать значения

Public Function GetSomething() As Int
     GetSomething = 4
End Function

Мой VB невероятно устарел. Это может быть медленнее, если использовать явный оператор return

Ответ 6

Обычно есть 2 точки, в которых я выхожу из функции. В самом начале моих методов проверки входящих данных:

if (myParameter == null)
   throw new ArgumentNullException("myParameter");

И/или в самом конце метода.


private bool GetSomeValue()
{
    bool returnValue = false;
    // some code here
    if (some condition)
    {
        returnValue = some expression
    }
    else
    {
        returnValue = some other expression;
    }
    return returnValue;
}

Причина, по которой я не возвращаюсь внутри условного, заключается в том, что есть 1 точка выхода функции, она помогает при отладке. Никто не хочет поддерживать метод с 12 возвращающими утверждениями в нем. Но это мое личное мнение. Я бы ошибался на стороне читаемости и не беспокоился об оптимизации, если вы не имеете дело с ситуацией в режиме реального времени.