2010-09-02 5 views
1

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

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

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

+1

Что альтернатива? Проверка состояния перед вызовом? Не очень СУХОЙ. – Lazarus

+0

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

ответ

2

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

Обратите внимание, что если метод очень коротким, 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()); 

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

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

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

0

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

+0

Обратите внимание, что это был компилятор JIT, а не компилятор C#. –

+0

Хорошее разъяснение, Скит –

+0

Но до сих пор неясно, как JIT будет встроить метод, который не является тривиальным. Может быть, это то, что вы подразумеваете под «наивными»? –

Смежные вопросы