Затраты на вызов метода - PullRequest
       9

Затраты на вызов метода

2 голосов
/ 02 сентября 2010

Каковы затраты на вызов метода в .NET, который немедленно возвращается (потому что условие, которое является первым кодом внутри, не выполняется)?

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

Любое другое мнение?

Ответы [ 2 ]

2 голосов
/ 02 сентября 2010

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

Обратите внимание, что если метод очень короткий, JIT-компилятор может встроить его - но если это большой метод, из которого вам просто случается для быстрого выхода, он, вероятно, победит ' т. В крайних случаях вы можете разделить метод на два: один короткий метод (который может быть встроен), чтобы проверить, является ли остальной метод правильным, и один, чтобы фактически выполнить работу. Затем вы можете сначала выполнить тест, а затем вызвать второй метод. Честно говоря, мне это не очень нравится, и я бы только предложил сделать это после того, как обнаружил, что это действительно проблема ... но, по крайней мере, у вас есть предложение для ваших коллег на случай, когда это действительно было показано, что это проблема:)

Одна вещь, о которой вы можете захотите подумать как причина, чтобы избежать вызовов методов, - это если оценка аргументов занимает много времени. Например, рассмотрим ведение журнала:

Log.Info("I did something: {0}", action.GenerateDescription());

Теперь, если GenerateDescription занимает много времени, вы не захотите его выполнять, если ведение журнала в любом случае не произойдет ... поэтому вы можете написать:

if (Log.IsEnabled(LogLevel.Info))
{
    Log.Info("I did something: {0}", action.GenerateDescription());
}

Другой альтернативой является использование делегата для отсрочки оценки - хотя это может иметь свои (небольшие) затраты:

Log.Info("I did something: {0}", () => action.GenerateDescription());

или используя метод преобразования gruop:

Log.Info("I did something: {0}", action.GenerateDescription);

Возможно, это не та проблема, о которой беспокоятся ваши коллеги, но о ней стоит подумать:)

0 голосов
/ 02 сентября 2010

Это зависит от того, как выглядит ваш метод, но компилятор может также «встроить» такие методы.Следовательно, вероятно, нет никаких накладных расходов вообще.

...